【AQS】独占锁与共享锁
引言
AQS的源码中涉及到的锁有独占锁与共享锁,独占锁就是只有一个线程可以获取锁,共享锁就是同时可以有多个线程获取锁。
代码层体现下AQS的state属性,为0,则锁没有被线程所持有,独占锁时为1,共享锁时大于0,代表获取此锁的现成的数量。
AQS的内部类Node定义了两个常量SHARED和EXCLUSIVE,他们分别标识AQS队列中等待线程的锁的获取模式。
1 | /** |
JUC中ReentrantLock与CyclicBarrier为独占锁,CountDownLatch与Semaphore为共享锁,
ReentrantReadWriteLock中writeLock为独占锁,ReadLock为共享锁。
独占锁与共享锁的区别:
- 独占功能
当锁被头节点获取后,只有头节点获取锁,其余节点的线程继续沉睡,等待锁被释放后,才会唤醒下一个节点的线程。 - 共享功能
只要头节点获取锁成功,就在唤醒自身节点对应的线程的同时,继续唤醒AQS队列中的下一个节点的线程,每个节点在唤醒自身的同时还会唤醒下一个节点对应的线程,以实现共享状态的“向后传播”,从而实现共享功能。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 ClawHub的技术分享!