1. AbstractQueuedSynchronizer
如果共享资源被占用,需要一定的阻塞等待唤醒机制保证锁分配。这个机制基于CLH队列的变体实现,将暂时获取不到锁的线程加入队列中,这个队列就是AQS同步队列的抽象表现。它将要请求共享资源的线程及自身的等待状态封装成队列的结点对象,通过CAS、自旋以及LockSupport.park() 的方式,维护state变量的状态,使并发达到同步效果。
2. ReentrantLock
ReentrantLock基于Sync实现,lock() 和unlock() 也基于Sync实现
3. tryAcquire
protected final boolean tryAcquire(int acquires) {
if (getState() == 0 &&
// 检查队列前面是否还有节点
!hasQueuedPredecessors() &&
// 抢占成功
compareAndSetState(0, acquires)) {
// 设置抢占成功的线程
setExclusiveOwnerThread(Thread.currentThread());
return true;
}
return false;
}