AQS专题
1 队列同步器(AQS)
用来构建锁或者其他同步组件的基础框架,使用了一个int成员表示同步状态,通过内置的FIFO队列来完成资源获取线程的排队工作.
同步器的主要使用方式是继承,子类通过继承同步器并实现它的抽象方法来管理同步状态,在抽象方法的实现过程中免不了要对同步状态进行更改.
同步器自身没有实现任何同步接口,它仅仅是定义了若干同步状态获取和释放的方法来供自定义同步组件来使用,同步器既可以支持独占式获取同步状态,也可以共享式的获取同步状态.
2 队列同步器的实现分析
(1) 同步队列
同步器依赖内部的同步队列(FIFO双向队列)来完成同步状态的管理,当前线程获取同步状态失败时,同步器会将当前线程以及等待状态等信息构造成一个节点并将其加入同步队列,同时会阻塞当前线程,当同步状态释放时,会把首节点中的线程唤醒,并再次尝试获取同步状态.
如果使用一个普通的LinkedList来维护节点之间的关系,当一个线程获取了同步状态,其他多个线程由于调用tryAcquire(int arg)方法获取同步状态失败而被添加到了LinkedList时,因此同步器通过死循环来保证节点的正确添加,在"死循环"中只有通过cas将节点置为尾节点之后,该线程才能从该方法返回.
前驱节点为头节点且能够获取同步状态的判断条件和进入等待状态是获取同步状态自旋的过程。当获取同步状态获取成功之后,当前线程从acquire(int args)方法返回,代表当前线程获取了锁.
-----> 总结: 在获取同步状态时,同步器维护一个同步队列,获取状态失败的线程都会被加入到队列中并且在队列中进行自旋;移出队列的条件是前驱节点为头节点并且成功的获取了同步状态.在释放同步状态时,同步器调用tryRelease()方法释放同步状态,然后唤醒头节点的后继节点.