JUC锁框架——基于AQS的实现,从ReentrantLock认识独占和共享
JDK中有以下基于AQS的实现 ReentrantLock CountDownLatch Semaphore ReentrantReadWriteLock CyclicBarrier (委托给ReentrantLock) 首先关于源码中经常出现 final ReentrantLock takeLock = this.takeLock 写法: 这是一个有关volatile变量的lock-free的典型习惯编码。在第一行第一次到读到变量后,另一个线程会更新这个值,但你只对初始读到的值感兴趣。 另外,即使我们讨论的成员变量不是 volatile而是final, 这个习惯用法也与CPU缓存有关:从栈读变量比从堆读变量会更cache-friendly,本地变量最终绑定到CPU寄存器的可能性更高。 ReentrantLock的独占和共享: 基本上一致,区别: 非公平锁是: 先state+1,然后直接得到锁, 而公平锁则是: 先尝试去获取锁,如果得到了锁则state+1. 实现公平性的关键在于:如果锁被占用且当前线程不是持有者也不是等待队列的第一个,则进入等待队列。 可见是否公平实际上是对处于等待队列中的线程来说的。 ReentrantLock都是把具体实现委托给内部类 而不是直接继承自AbstractQueuedSynchronizer, 这样的好处是用户不会看到不需要的方法,