Java 同步工具AQS:AbstractQueuedSynchronizer

1AQS是什么

java.util.concurrent包中,LOCK用到了一个同步队列AQS - AbstractQueuedSynchronizer

1.1AQS的功能

独占和共享,即 排他锁/非排他锁

共享:允许多个线程同时获取锁,并发访问共享资源资源,比如ReentrantReadWriteLock

1.2AQS的内部实现

AQS队列内部维护的是一个FIFO的双向链表

如图示,每一个NODE节点由线程封装,当线程争抢锁失败后会封装成NODE加入到AQS队列中去;当获取锁的线程释放锁以后,会从队列中唤醒一个阻塞的节点(即线程)。即释放锁和锁竞争的时候会影响AQS队列的变化。

1.3AQS队列变化分析

如图所示,线程A获取锁之后,将自己设置成为头节点。在AQS队列中,head节点表示获取锁成功的节点。当线程B来竞争锁的时候。会涉及到两个变化。

新的线程封装成为新的NODE节点追加到同步队列中

1.设置自身的prev节点指向获取锁的node节点,即head节点

2.设置获取锁的next节点指向新加入的node节点

当头节点释放同步状态时,会唤醒后继节点,如果后继节点获得锁成功。

1.将自身设置为head节点

2.设置自身prev节点指向null

值得注意的是,设置head节点不需要用CAS,原因是该操作由获得锁的线程完成,而同步锁只能由一个xian线程获得,不需要CAS保证,只需要把原head节点的后继节点设置成为head节点,并且断开原head节点的next引用即可。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值