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

Java并发编程 - ReentrantLock

AQS内部属性

state(volatile修饰):为0是标记没有被占用,大于0时表示被其它线程或当前线程占用,对于ReentranLock,state可以大于1,表示多次重入,每次所释放时state减1,直至state等于0时释放锁。

head:等待队列的头节点,head后节点为null节点,链表为是双向链表,便于查找前驱和后继节点。

tail:等待队列的尾节点。

exclusiveOwnerThread:持有锁的线程。

AQS使用双向链表的原因

  1. 当某个线程出现异常不需要竞争锁,比如线程被中断了,可以快速移除链表。
  2. 通过lock()竞争锁时,需要不断的判断当前线程的前驱节点是否是head,如果是才能成功获得锁。

ReentrantLock实现原理

ReentrantLock默认使用NonfairSync实现类,NonfairSync和FairSync继承Sync,Sync是一个抽象类。

加锁流程(lock)

加锁成功(tryAcquire)

  1. 如果state=0,通过CAS尝试将state赋值为1,同时设置exclusiveOwnerThread为当前线程。
  2. 如果state!=0,判断exclusiveOwnerThread是否为当前线程,如果是当前线程state+1。

加锁失败(acquireQueued)

  1. (addWaiter)先创建Node节点,放到等待队列尾部。如果是tail节点为null,会先创建一个Dummy节点(空节点),head和tail的引用指向Dummy节点,在创建Node节点,放到等待队列尾部。

node节点如何插入到队列尾部过程

    • 把当前线程的node的prev指向tail
    • 通过cas把node节点设置为新tail
    • 把原tail节点的next指向当前node

  1. (acquireQueued)如果创建的Node节点的前驱节点是head节点,会在尝试一次锁竞争(tryAcquire),竞争失败走3。
  2. (shouldParkAfterFailedAcquire)将前驱节点的waitStatus改为-1,并返回false,再次执行acquireQueued(改成-1的作用是:告知前驱节点有责任去唤醒下一个节点)。
  3. (parkAndCheckInterrupt)阻塞当前线程。

释放锁流程(unlock)

  1. (tryRelease)state-1,当state=0时,设置exclusiveOwnerThread为null,并返回true表示锁释放成功,否则返回false。

  1. (release)判断head!=null&&head.waitStatus!=0,则表明需要唤醒head的后继节点(unparkSuccessor)。
  2. (acquireQueued),被parkAndCheckInterrupt阻塞的线程会继续执行for循环,(tryAcquire)如果竞争成功会设置当前节点为头节点,头节点的下一个节点为null(方便GC)。
  3. (acquireQueued)如果后继节点竞争失败,继续阻塞。

ReentryLock 特性

  1. 支持可重入
  2. 支持阻塞竞争锁和非阻塞竞争锁,lock()和tryLock()
  3. 支持公平和非公平锁

相关文章:

  • 运维打铁:Centos 7 安装 redis_exporter 1.3.5
  • Vue 3 相比 Vue 2 的优势
  • 开发 MCP Proxy(代理)也可以用 Solon AI MCP 哟!
  • Netty线上如何做性能调优?
  • 弄清C语言中的链表
  • FPGA上实现YOLOv5的一般过程
  • STM32 的 GPIO和中断
  • 基于深度学习和单目测距的前车防撞及车道偏离预警系统
  • git 操作
  • STM32 串口通信
  • Git 详细使用说明文档(适合小白)
  • MVCC详解
  • maven工程中引入外部jar
  • 信息系统项目管理工程师备考计算类真题讲解八
  • 拥抱健康生活,解锁养生之道
  • Trae或者VsCode无法识别相对路径(不自动切换工作目录)
  • VSCode如何修改默认扩展路径和用户文件夹目录到其他盘以及微信开发工具如何修改扩展路径到其他盘
  • C# 音频分离(MP3伴奏)
  • WHAT - 区分 Git PR 和 MR
  • 使用setGraphicsEffect重新设置阴影导致程序崩溃的问题
  • 我国首次发布铁线礁、牛轭礁珊瑚礁“体检”报告,菲炮制言论毫无科学和事实依据
  • 长三角议事厅|国际产业转移对中国产业链韧性的影响与对策
  • 恒瑞医药一季度营收72亿元,净利增超36%:授权交易推动利润增长
  • 外卖江湖战火重燃,骑手、商家、消费者在“摇摆”什么?
  • 东方富海陈玮: 什么样的创业者能让天使投资人愿意下注
  • 深一度|坚守17年,这件事姚明就算赔钱也在继续做