引言

AQS的源码中涉及到的锁有独占锁与共享锁,独占锁就是只有一个线程可以获取锁,共享锁就是同时可以有多个线程获取锁。
代码层体现下AQS的state属性,为0,则锁没有被线程所持有,独占锁时为1,共享锁时大于0,代表获取此锁的现成的数量。
AQS的内部类Node定义了两个常量SHARED和EXCLUSIVE,他们分别标识AQS队列中等待线程的锁的获取模式。

1
2
3
4
/**
* The synchronization state.
*/
private volatile int state;

JUC中ReentrantLock与CyclicBarrier为独占锁,CountDownLatch与Semaphore为共享锁,
ReentrantReadWriteLock中writeLock为独占锁,ReadLock为共享锁。

独占锁与共享锁的区别:

  • 独占功能
    当锁被头节点获取后,只有头节点获取锁,其余节点的线程继续沉睡,等待锁被释放后,才会唤醒下一个节点的线程。
  • 共享功能
    只要头节点获取锁成功,就在唤醒自身节点对应的线程的同时,继续唤醒AQS队列中的下一个节点的线程,每个节点在唤醒自身的同时还会唤醒下一个节点对应的线程,以实现共享状态的“向后传播”,从而实现共享功能。