AQS称作队列同步器(AbstractQueuedSynchronizer)。
实现一把具有阻塞和唤醒功能的锁需要的核心要素
1、需要一个state变量标记锁的状态,该变量起码有0和1两个状态,对state操作需要用CAS确保线程安全。在源码中,ASQ类中定义了一个volatile 的state属性。
2、记录哪个线程持有锁。在源码中,AQS的父类AbstractOwnableSynchronizer中定义了一个transient Thread exclusiveOwnerThread属性来实现。
3、需要底层支持对线程进行阻塞或唤醒操作。LockSupport类将UNSAFE的阻塞和唤醒操作原语封装到park()和unpark()方法中在向上提供相应操作,值得注意的是unpark()能精准唤醒某个线程,而notify()是随机唤醒。
4、需要一个队列维护阻塞的线程,这个队列需要用CAS保证线程安全。
参考资料:《Java并发实现原理:JDK源码剖析》余春龙