ReentranLock 使用AQS实现同步锁原理
2020-05-29 10:22:14 0 举报
ReentranLock 使用AQS实现同步锁原理
作者其他创作
大纲/内容
失败/或者不是紧挨
尝试将AQS中的state值由0改为1,如果是同一个线程的重入则累加1
公平与非公平锁就是拿锁的逻辑稍有不同:公平锁拿锁的时候队列有等待(还要排除尝试拿锁的Node不是紧挨head的那个,因为如果这次是紧挨head的Node尝试拿锁是允许成功的)的,自己就得去队尾等着;非公平的可直接尝试拿锁拿不到再去队尾等着
被前一个节点放锁unpark叫醒
成功
这一步如果时公平锁是肯定能拿到的,若是非公平锁,则有可能被刚来未入队的抢先
park阻塞
若是紧挨着head节点的那个,就在尝试一次拿锁
放入AQS队列
将前一个的waitState改为-1,告知前一个节点“我在你后边阻塞着呢,你完事后记得叫醒我啊”
若当前是紧挨head节点,为了防止当前节点刚要告诉前节点,还没告诉(即执行head.waitState=-1之前),前一个节点刚好unlock,这样unlock中就感知不到后边还有节点,无法unpark他,所以此时会再进行一次尝试拿锁
(队列中如果有头部则头部中thread为null,没有则创建一个thread为null的头部,然后将当前thread作为一个节点放到尾部)
尝试拿锁
失败
.unlock释放锁(如果减到0,并且头部后还有节点【head.waitStatus!=0】的则unpark队列中的下一个)
调用.lock()
0 条评论
回复 删除
下一页