一、基础概念

AQS(AbstractQueuedSynchronizer):是jdk并发包java.util.concurrent下绝大部分工具类实现的基础。

管程:是指管理共享变量以及对共享变量操作的过程,让它们支持并发

JVM层对管程的实现:synchronized

JAVA层对管程的实现:AQS抽象层,对AQS进行实现

JAVA的线程安全问题解决方案:cas+自旋(会出现空转cpu的问题)、synchronized、reentrantLock 会阻塞未获取锁的线程

----- JDK中提供的大多数的同步器如Lock,Latch,Barrier等,都是基于AQS框架来实现的,一般事通过一个内部类Sync继承AQS将同步器所有调用都映射到Sync对应的方法        

AQS之ReentrantLock独占锁源码解析-LMLPHP

  二、AQS

特性:阻塞等待队列    共享/独占   公平/非公平  可重入  允许中断

 AQS内部维护属性 volatile int state

        表示同步的状态,对于独占锁而言,这个属性可以网上增加,每重入一次就+1;对于共享锁而言,就是资源个数,每来一个-1,当减为0以后,后续的资源就不能获取到锁了。

AQS之ReentrantLock独占锁源码解析-LMLPHP

         state三种访问方式

        getState()  setState()  compareAndSetState()

AQS定义两种资源共享方式:

Exclusive 独占,只有一个线程能获取锁执行,如ReentrantLock

Share  共享 ,多个线程可以同时执行,如 Semaphore/CountDownLatch

AQS定义两种等待队列:

同步等待队列:主要用于维护获取锁失败时入队的线程

条件等待队列:调用await()的时候会释放锁,然后线程会加入到条件队列,调用signal()唤醒的时候会把条件队列中的线程节点移动到同步队列中,等待再次获得锁。

        不同的自定义同步器竞争共享资源的方式也不同。自定义同步器在实现时只需要实现共享 资源state的获取与释放方式即可,至于具体线程等待队列的维护(如获取资源失败入队/唤醒出队等),AQS已经在顶层实现好了。自定义同步器实现时主要实现以下几种方法:

04-04 13:55