当前位置: 首页 > article >正文

ReentrantLock 的实现原理

ReentrantLock

ReentrantLock 是一种可重入的排它锁,主要用来解决多线程对共享资源竞争的问题。它的核心特性有几个:

  • 它支持可重入,也就是获得锁的线程在释放锁之前再次去竞争同一把锁的时候,不需要加锁就可以直接访问。
  • 它支持公平和非公平特性。
  • 提供了阻塞竞争锁和非阻塞竞争锁的两种方法,分别是 lock()和 tryLock()。

ReentrantLock 的实现原理

ReentrantLock 的底层实现有几个非常关键的技术:
  • 锁的竞争,ReentrantLock 是通过互斥变量,使用 CAS 机制来实现的。
  • 没有竞争到锁的线程,使用了 AbstractQueuedSynchronizer 这样一个队列同步器来存储,底层是通过双向链表来实现的。当锁被释放之后,会从 AQS 队列里面的头部唤醒下一个等待锁的线程。
  • 公平和非公平的特性,主要是体现在竞争锁的时候,是否需要判断 AQS 队列存在等待中的线程。
  • 最后,关于锁的重入特性,在 AQS 里面有一个成员变量来保存当前获得锁的线程,当同一个线程下次再来竞争锁的时候,就不会去走锁竞争的逻辑,而是直接增加重入次数。


http://www.kler.cn/a/106716.html

相关文章:

  • Elastic Agent:可灵活地在任何地方发送和处理任何数据
  • 2024 CCF中国开源大会“开源科学计算与系统建模openSCS”分论坛成功举办
  • 文献阅读 | Nature Communications:使用自适应图注意自动编码器从空间解析的转录组学中解读空间域
  • HarmonyOS NEXT应用开发实战 ( 应用的签名、打包上架,各种证书详解)
  • 2分钟在阿里云ECS控制台部署个人应用(图文示例)
  • 云运维基础
  • 【OpenCV实现图像的几何变换】
  • 5G与无人驾驶:引领未来交通的新潮流
  • MySQL - Heap 表是什么?
  • mysql源码安装
  • 求分数序列和(c++题解)
  • Go基础——数组、切片、集合
  • C++之lambda匿名函数总结(二百四十五)
  • 【ARM 嵌入式 C 入门及渐进 10 -- 冒泡排序 选择排序 插入排序 快速排序 归并排序 堆排序 比较介绍】
  • Mysql,SqlServer,Oracle获取库名 表名 列名
  • 配置VUE环境过程中 npm报错的处理方案以及VUE环境搭建过程
  • 线扫相机DALSA--采集卡Base模式设置
  • 工控安全与网络安全有什么不同?
  • 在Win11上部署ChatGLM2-6B详细步骤--(上)准备工作
  • 算法通关村第三关-白银挑战双指针思想
  • 操作系统缓冲区管理(单缓冲,双缓冲,循环缓冲,缓冲池)
  • SpringMVC(四)域对象共享数据
  • Django 全局配置 settings 详解
  • 730. 机器人跳跃问题--二分
  • 【报错】java.sql.SQLException: Invalid utf8mb3 character string: ‘ACED00‘
  • Fourier分析导论——第1章——Fourier分析的起源(E.M. Stein R. Shakarchi)