简介:

AQS全称 AbstractQueuedSynchronizer,提供了一个基于FIFO(先进先出)队列可以用于构建锁或者其他相关同步装置的基础框架。

ReentrantLock、Semaphore、CountDownLatch、FutrueTask,这些都是基于AQS构建的。

而AQS是基于volatile变量的读/写和CAS( 也就是compareAndSet()方法 )实现的。

volatile可以保证并发中的可见性,还可以禁止指令重排序。CAS,用于管理对共享数据的并发访问。

状态信息state:

AQS的子类通过继承AQS并实现它的方法来管理其状态,管理的方式就是通过类似acquire()和release()的方式来操纵状态。

acquire()获取状态、维护状态。release()释放状态。

AQS这个同步器利用了一个int整数来表示状态信息。

状态信息state用volatile修饰,可以通过getState(),setState()以及compareAndSetState()等方法来进行操作。

状态信息state在不同的AQS子类中有不同的含义,比如在信号量Semaphore中,每次acquire()就会使state减一,而每次release()就会使state加一。

在其他的子类中,acquire()、release()具体含义也是不同的。

FIFO队列:

内部的FIFO队列通过内部类Node实现。

队列中的元素Node就是保存着线程引用和线程状态的容器,每个线程对同步器的访问,都可以看做是队列中的一个节点。

Node类的结构如下:

int waitStatus     表示节点的状态。其中包含的状态有:

  • CANCELLED,值为1,表示当前的线程被取消;
  • SIGNAL,值为-1,表示当前节点的后继节点包含的线程需要运行,也就是unpark;
  • CONDITION,值为-2,表示当前节点在等待condition,也就是在condition队列中;
  • PROPAGATE,值为-3,表示当前场景下后续的acquireShared能够得以执行值为0,表示当前节点在sync队列中,等待着获取锁。

Node prev     前驱节点,比如当前节点被取消,那就需要前驱节点和后继节点来完成连接。
Node next     后继节点。
Node nextWaiter     存储condition队列中的后继节点。
Thread thread     入队列时的当前线程。

ConditionObject:

而另一个内部类ConditionObject实现了Condition接口,并且实现了其中的await(),signal(),signalALL()等方法。
 ConditionObject主要是为并发编程中的同步提供了等待通知的实现方式,可以在不满足某个条件的时候挂起线程等待。直到满足某个条件的时候在唤醒线程。

参考博客:

大白话聊聊对AQS的理解。

http://ifeve.com/introduce-abstractqueuedsynchronizer/

最新文章

  1. android删除无用资源文件的python脚本
  2. 封装ios静态库碰到的一些问题(一)
  3. uva 1001(最短路)
  4. split function of Perl,Python,Awk
  5. discuz常用变量
  6. poj2245
  7. 常用布局,div竖直居中
  8. 物理机(真实机)能ping通虚拟机,但是虚拟机无法ping通真实机(可能是防火墙问题)
  9. Django App(二) Connect Mysql & defualt App admin
  10. python 中常见绘图属性
  11. mysql5.6升级到5.7后Sequel Pro无法连接解决
  12. 搭建日志收集系统时使用客户端连接etcd遇到的问题
  13. 浅谈Spring MVC知识
  14. redis该怎么用
  15. Android中的各种访问权限Permission含义
  16. GOlang eclipse install
  17. api数据接口
  18. spark VS mapreduce
  19. Quartz 的使用
  20. 对比python的进程和线程:多线程是假的

热门文章

  1. JVM内存监视手段和内存溢出解决方案
  2. 杂项:Juice UI
  3. [转]JSON.stringify 详解
  4. Access restriction: The type Resource is not accessible due to restriction on required library
  5. shell脚本判断语句和循环语句
  6. [UE4]多播代理
  7. Hibernate 一对一
  8. unicode 转码 ansi
  9. ORM Nhibernet 框架的 CRUD 操作
  10. Survival Coxph log-rank