java并发编程和高并发——J.U.C之AQS首要概述

一、J.U.C之AQS介绍:

1、概述:J.U.C表示jdk中java.util.concurrente 包里的内容,是从jdk6中引入的java并发包。J.U.C大大提高了java程序的并发性能。

而AQS被认为是J.U.C的核心,指AbstractQueuedSynchronizer  的缩写。AbstractQueuedSynchronizer这个类提供了基于firstIn  firstOut队列。这个队列可以构建锁或者其他相关的同步装置的基础框架。

作为一个双向列表,结构大致如下:

java并发编程和高并发——J.U.C之AQS首要概述

注:上方的sync queue 是所说的双向队列,有头结点和尾结点。

而下方的condition queue 不是必须有的,而且在有condition时才会出现,并且condition的数量可以不确定。

2、AQS设计特点:

》使用Node实现FIFO队列,可以用于构建锁或者其他同步装置的基础框架。

 》利用了一个int类型表示状态;在AQS类中,有一个成员变量state,而基于AQS有一个同步 组件 RetreenLock  锁,在这个锁中,state表示获取到线程的数量。如果为0,表示还没有线程获取锁,如果是1,表示有一个线程获取到锁,如果是两个及以上,表示重复锁的数量。

》使用方法是继承。AQS基于模板方法进行设计,使用者需要继承于AQS,子类需要重写其中的方法。

》子类通过继承并通过实现它的方法管理其状态{acquire  和 release }的方法操纵状态;

》可以同时实现排它锁和共享锁模式(独占、共享)。注:使用者只会使用独占或者共享其中一套API来实现,而不是两个同时使用。

3、AQS使用时的设计思路:

AQS内部维护了一个cl 队列来管理锁,线程会首先获取锁,如果获取锁失败,就将当前线程以及等待状态等信息包成一个Node结点加入到之前所说的队列sync中,之后会不断地循环尝试获取锁。它的条件是当前结点为head直接的后继才会去尝试,如果失败就会阻塞自己,直到自己被唤醒。而当持有锁的线程释放锁时会唤醒队列中的后继线程。

 基于这样基础的设计思路,jdk中提供了很多基于AQS的子类,即AQS同步组件。

4、AQS同步组件有哪些呢?

》CountDownLatch  : 闭锁,通过计数来保证线程是否需要一直被阻塞。

》Semaphore  :能够控制同一时刻的并发数目

》CyclicBarrier  : 它和CountDownLatch很像,都能阻塞进程。

》ReentranLock :很重要,之后会有详细介绍。

》FutureTask :之后详细介绍。

其他的还有很多,但如上更常用。