AQS独占锁与共享锁
AQS阻塞队列与条件队列
AQS阻塞队列
双向链表
ReentrantLock
AQS条件队列
对应AbstractQueuedSynchronizer的内部类ConditionObject implements Condition,每一个ConditionObject对象,都会维护一个单向链表12345678Lock lock = new ReentrantLock();Condition provider = lock.newCondition();Condition consumer = lock.newCondition();//此处如果获取锁失败,会调用acquireQueued(addWaiter(Node.EXCLUSIVE),arg)将当前线程以Node节点加入同步队列,自旋获取锁,没获取到则阻塞lock.lock();//能到这一步的前提是上一步已经成功获取锁,即没有加入同步队列,此处调用await()会将当前线程以Node节点加入条件队列,并且释放锁。provider.await();consumer.signalAll();
ReentrantReadWriteLock