AQS深入理解与实战----基于JDK1.8
要介绍AQS,首先要介绍“同步器”的概念。 同步器 是一种抽象数据类型,在该类型的内部,维护了以下内容: 1.一个状态变量,该变量的不同取值可以表征不同的同步状态语义(例如表示一个锁已经被线程持有了还是没有任何线程持有); 2.能够更新和检查该状态变量值的操作(方法)集合; 3.至少有一个方法——当同步状态的值需要时可调用该方法阻塞来修改该状态的线程;或当其他的线程修改了同步状态值,可允许调用该方法唤醒其他阻塞线程 简单说,同步器中包含一个 可表征同步状态的变量 , 可操作该变量的方法集 ,以及 可阻塞或唤醒其他来修改该状态的线程的方法集 。 互斥锁,读写锁,信号量,屏障,事件指示器等等都是同步器。 AQS,全称是AbstractQueuedSynchronizer,中文译为 抽象队列式同步器 。这个抽象类对于JUC并发包非常重要,JUC包中的ReentrantLock,,Semaphore,ReentrantReadWriteLock,CountDownLatch等等几乎所有的类都是基于AQS实现的。 “抽象”是说该类是一个 抽象类, “队列式同步器”是说AQS使用 队列来 管理多个抢占资源的线程 。AQS在其内部实现了上面所说的同步器的三要素,而且它会把抢占资源失败的线程放入自己内部的一个队列当中维护起来,在这个队列内部的线程会排队等待获取线程。