美文网首页
队列同步器AbstractQueuedSynchronizer源

队列同步器AbstractQueuedSynchronizer源

作者: zhanglbjames | 来源:发表于2017-05-27 20:17 被阅读0次

此续文将介绍共享模式获取和释放同步状态的原理

1. acquireShared

image.png

2. tryAcquireShared

image.png

3. doAcquireShared

image.png

4. setHeadAndPropagate

image.png

5. releaseShared

image.png
这个方法,是先保证同步状态修改成功后才会进行调用doReleaseShared来释放同步状态的,所以tryReleaseShared和doReleaseShared这两个方法都得保证线程访问的安全性(死循环CAS)。保证同步状态的改变和同步状态的释放一致

6. tryReleaseShared

image.png

7. doReleaseShared

image.png

当head节点状态由初始状态变为PROPAGATE时,后继节点(此时后继节点并没有阻塞,前面已经说过只有前继节点为SIGNAL时线程才会阻塞)继续自旋获取同步状态,当失败时将由shouldParkAfterFailedAcquire方法将其前继节点的状态由PROPAGATE变为SIGNAL了,在下次失败后将被阻塞。

总结

共享模式获取是如何控制多个线程同时获取同步状态和释放同步状态的?

  1. 同步状态的获取:

首先,一开始通过tryAcquireShared获取成功的线程是不会加入等待队列的,** 是通过保证多个线程同时调用tryAcquireShared的线程安全性来达到一开始多个线程共享获取同步状态的 **,但是当达到共享状态量的上限时,tryAcquireShared获取失败,才会将失败线程放到等待队列中,这时在等待队列中会按照FIFO的规则来获取同步状态。

  1. 同步状态的释放:

不同于独占模式,共享模式下存在同时有多个线程同时释放的情况,所以tryReleaseShared(用来保证同步器状态的改变)和doReleaseShared(用来保证后继节点的通知以及节点等待状态的改变)需要死循环CAS来保证线程安全释放。

相关文章

网友评论

      本文标题:队列同步器AbstractQueuedSynchronizer源

      本文链接:https://www.haomeiwen.com/subject/xqxqfxtx.html