JAVA并发编程系列(六)深入理解AQS原理

并发是程序员必须面对的问题,那我们怎么处理好呢?下面给大家分享一下AQS原理,以便于大家更好的实现并发,减少更多的弯路。

JAVA并发编程系列(六)深入理解AQS原理_第1张图片

      所谓的AQS(AbstractQueuedSynchronizer)即是抽象的队列式的同步器,内部定义了很多锁相关的方法,我们熟知的ReentrantLockReentrantReadWriteLockCountDownLatchSemaphore等都是基于AQS来实现的。

    我们先看下AQS相关的UML图:

JAVA并发编程系列(六)深入理解AQS原理_第2张图片

AQS实现原理

   AQS 中 维护了一个 volatile int state(代表共享资源)和一个FIFO线程等待队列(多线程争用资源被阻塞时会进入此队列)。

这里volatile能够保证多线程下的可见性,当state=1则代表当前对象锁已经被占有,其他线程来加锁时则会失败,加锁失败的线程会被放入一个FIFO的等待队列中,比列会被UNSAFE.park()操作挂起,等待其他获取锁的线程释放锁才能够被唤醒。

另外state的操作都是通过CAS来保证其并发修改的安全性。

具体原理我们可以用一张图来简单概括:

JAVA并发编程系列(六)深入理解AQS原理_第3张图片 AQS

 

AQS 中提供了很多关于锁的实现方法:

  • getState():获取锁的标志state值

  • setState():设置锁的标志state值

  • tryAcquire(int):独占方式获取锁。尝试获取资源,成功则返回true,失败则返回false。

  • tryRelease(int):独占方式释放锁。尝试释放资源,成功则返回true,失败则返回false。 

下个文章准备模拟多线程竞争锁、释放锁的场景来进行分析AQS源码、今天有点累了

你可能感兴趣的:(JAVA并发编程系列(六)深入理解AQS原理)