此续文将介绍共享模式获取和释放同步状态的原理
1. acquireShared
2. tryAcquireShared
3. doAcquireShared
4. setHeadAndPropagate
5. releaseShared
这个方法,是先保证同步状态修改成功后才会进行调用doReleaseShared来释放同步状态的,所以tryReleaseShared和doReleaseShared这两个方法都得保证线程访问的安全性(死循环CAS)。保证同步状态的改变和同步状态的释放一致
6. tryReleaseShared
7. doReleaseShared
当head节点状态由初始状态变为PROPAGATE时,后继节点(此时后继节点并没有阻塞,前面已经说过只有前继节点为SIGNAL时线程才会阻塞)继续自旋获取同步状态,当失败时将由shouldParkAfterFailedAcquire方法将其前继节点的状态由PROPAGATE变为SIGNAL了,在下次失败后将被阻塞。
总结
共享模式获取是如何控制多个线程同时获取同步状态和释放同步状态的?
- 同步状态的获取:
首先,一开始通过tryAcquireShared获取成功的线程是不会加入等待队列的,** 是通过保证多个线程同时调用tryAcquireShared的线程安全性来达到一开始多个线程共享获取同步状态的 **,但是当达到共享状态量的上限时,tryAcquireShared获取失败,才会将失败线程放到等待队列中,这时在等待队列中会按照FIFO的规则来获取同步状态。
- 同步状态的释放:
不同于独占模式,共享模式下存在同时有多个线程同时释放的情况,所以tryReleaseShared(用来保证同步器状态的改变)和doReleaseShared(用来保证后继节点的通知以及节点等待状态的改变)需要死循环CAS来保证线程安全释放。