Java并发编程

AQS简介

2019-08-08  本文已影响2人  Java技术天地

  队列同步器AbstractQueuedSynchronizer(以下简称AQS)是用来构建锁或者其他同步组件的基础框架,它使用了一个int成员变量state来表示同步状态,通过内置一个FIFO队列来完成资源获取线程的排队工作。并发包的作者(Doug Lea)期望它能够实现大部分同步需求的基础。它是JUC并发包中的核心基础组件。

  同步器AbstractQueuedSynchronizer是一个抽象类,因此同步器的主要使用方式是继承。子类通过继承同步器并实现它的抽象方法来管理同步状态。在抽象方法的实现过程中,免不要对同步器的状态进行更新,因此同步器中提供了3个设置和修改同步状态的方法,它们分别是:

  1. getState(): 获取当前同步器的状态。
  2. setState(int newState): 设置当前同步器的状态
  3. compareAndSetState(int expect, int update): 原子性的更新当前同步器的状态。如果当前同步器的状态值和期望值(expect)相等,则将同步器的状态值更新为update的值,否则不更新当前同步器状态值。

  子类推荐被定义为自定义同步器的静态内部类,同步器自身没有实现任何同步接口,它仅仅是定义了若干同步状态的获取和释放的方法来供自定义同步组件的只用。同步器即可以支持独占模式获取同步器状态,也支持共享模式获取同步器状态,这样就可以实现不同类型的同步器组件(ReentrantLock、ReentrantReadWriteLock、Semaphore和CountDownLatch等)。同步器隐藏了大量的实现细节,简化了锁的实现方法,屏蔽了同步状态的管理,线程的排队、等待与唤醒等底层操作。

  同步器主要提供了以下方法:

同步器提供的模板方法基本上分为3类:独占式获取与释放同步状态、共享式获取与释放状态以及查询同步队列中等待线程的情况。

只有掌握了同步器的工作原理才能更深入的理解JUC(并发包)中的其它组件,下一章LZ将用一个简单的例子来了解下同步器的工作原理。

微信扫一扫,关注公众号
上一篇 下一篇

猜你喜欢

热点阅读