首页 > 其他 > 详细

ReentrantLock

时间:2020-07-13 21:09:19      阅读:60      评论:0      收藏:0      [点我收藏+]

 三个内部类

技术分享图片

当指定公平锁参数时:

 

技术分享图片

 

所有的方法都委托给sync:

技术分享图片

 AQS(AbstractQueuedSynchronizer):

 

技术分享图片

 一个抽象类:

技术分享图片

 

维护了一个FIFO队列:

队列的节点结构如下:

技术分享图片

 

 

 

技术分享图片

 

技术分享图片

 

构造方法:

技术分享图片

 

父类维护了一个Thread对象,表示当前占用该锁的线程,并且提供了相应的get,set方法:

技术分享图片

 简单了解之后,开始“锁”:

 

技术分享图片

 

 

cas(compareAndSetState),java.util.concurrent.locks.AbstractQueuedSynchronizer#compareAndSetState:

技术分享图片

技术分享图片

技术分享图片

“native”.java 永远滴神!

cas成功之后便把当前线程设为锁的持有者:

技术分享图片

 

失败的话:

技术分享图片

 

当tryAcquire不成功并且acquireQueued之后,进行一次interrupt。

技术分享图片

首先获取当前锁被重入的次数,如果是0的话,尝试用cas获取一次锁。否则持有锁的线程是否是当前线程,如果是的话增加锁重入的次数。

技术分享图片

 

用当前线程实例化一个新的Node节点,如果cas成功追加到Node队列。否则:

技术分享图片

 

死循环重试?

 

ReentrantLock

原文:https://www.cnblogs.com/lccsblog/p/13295178.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!