ReentrantLock学习(四)lock&unlock过程中sync队列及状态变化

一、AQS中的队列

ReentrantLock锁的实现依赖于AQS,而AQS内部实现锁是依赖于

volatile int state 状态

volatile Node head,volatile Node tail链表,

模型大致如下  

AQS中的队列

status:记录当前锁是否被占用,lock的次数,例如0代表未被占用,2代表lock了2次

exclusiveOwnerThread:记录了当前占用锁的线程

head:等待队列的头结点,该节点并不是真正的线程等待节点,算是一个控制节点,CLH锁的核心部分

tail:等待队列的尾节点

 

二、队列及状态变化

*为了更好的展示,将head、tail的变化与status、exclusiveOwnerThread分开了*

1.thread1首次lock,head、tail为null无变化

head = null

tail = null

2.thread1未unlock,thread2调用lock

锁状态无变化

因为没有申请下锁,thread2需要添加到队列

3.thread1未unlock,thread3调用lock

锁状态无变化

因为没有申请下锁,thread3需要添加到队列

 4.thread1调用unlock

锁状态变化如下

 队列变化

5.thread2被unpark

锁状态变化如下

队列变化

 到此,一个完整的lock & unlock的sync状态以及队列变化已经完成。

三、其他说明

1.锁状态从0到1使用的CAS锁

2.等待线程节点放入队列尾部也是CAS锁+自旋

3.首次添加队列时,会new一个head节点(初始化队列),该节点设置也是通过CAS锁

4.每次增加节点到tail,都会修改prev节点状态为-1,意为prev节点需要唤醒他的next节点线程(CLH队列锁)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值