java并发:AQS的简单理解
简介:
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主要是为并发编程中的同步提供了等待通知的实现方式,可以在不满足某个条件的时候挂起线程等待。直到满足某个条件的时候在唤醒线程。
参考博客:
http://ifeve.com/introduce-abstractqueuedsynchronizer/
java并发:AQS的简单理解的更多相关文章
- java并发:CopyOnWriteArrayList简单理解
		Java集合的快速失败机制 “fail-fast” "fail-fast"是java集合的一种错误检测机制,当多个线程对集合进行结构上的改变的操作时,有可能会产生 fail-fas ... 
- [Java并发] AQS抽象队列同步器源码解析--锁获取过程
		要深入了解java并发知识,AbstractQueuedSynchronizer(AQS)是必须要拿出来深入学习的,AQS可以说是贯穿了整个JUC并发包,例如ReentrantLock,CountDo ... 
- [Java并发] AQS抽象队列同步器源码解析--独占锁释放过程
		[Java并发] AQS抽象队列同步器源码解析--独占锁获取过程 上一篇已经讲解了AQS独占锁的获取过程,接下来就是对AQS独占锁的释放过程进行详细的分析说明,废话不多说,直接进入正文... 锁释放入 ... 
- Java  并发AQS
		转载出处:http://www.cnblogs.com/waterystone/ 一.概述 谈到并发,不得不谈ReentrantLock:而谈到ReentrantLock,不得不谈AbstractQu ... 
- Java并发编程之深入理解线程池原理及实现
		Java线程池在实际的应用开发中十分广泛.虽然Java1.5之后在JUC包中提供了内置线程池可以拿来就用,但是这之前仍有许多老的应用和系统是需要程序员自己开发的.因此,基于线程池的需求背景.技术要求了 ... 
- JAVA并发-AQS知识笔记
		概述 AQS是AbstractQueuedSynchronizer的缩写,翻译成中文就是抽象队列同步器,AbstractQueuedSynchronizer这个类也是在java.util.concur ... 
- Java 并发编程学习笔记 理解CLH队列锁算法
		CLH算法实现 CLH队列中的结点QNode中含有一个locked字段,该字段若为true表示该线程需要获取锁,且不释放锁,为false表示线程释放了锁.结点之间是通过隐形的链表相连,之所以叫隐形的链 ... 
- 【Java并发编程之深入理解】Synchronized的使用
		原文:https://blog.csdn.net/zjy15203167987/article/details/82531772 1.为什么要使用synchronized 在并发编程中存在线程安全问题 ... 
- java中volatile的简单理解
		原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/7833881.html 据说,volatile是java语言中最轻量级的并发控制方式. vo ... 
随机推荐
- jstack可以定位到线程堆栈
			java命令--jstack 工具 JVM调优之jstack找出最耗cpu的线程并定位代码 jstack可以定位到线程堆栈,根据堆栈信息我们 
- 1019 General Palindromic Number (20 分)
			1019 General Palindromic Number (20 分) A number that will be the same when it is written forwards or ... 
- 搭建OpenStack先电云平台
			实际操作示意图 在VMware里面创建两台centos7的虚拟机作为搭建云平台的两节点配置如下: 1.第一台虚拟机 作为控制节点 2CPU 3G以上内存 硬盘50G 网络适配器一个nat 一个仅主 ... 
- 触屏设备上的多点触碰检测C++代码实现
			转自:http://aigo.iteye.com/blog/2272698 代码还是参考自Epic官方的塔防项目:StrategyGame 看了下C++的API,现成的API中貌似只支持单点触碰检测, ... 
- Ubuntu安装配置串口通讯工具minicom&&cutecom
			原帖地址:https://blog.csdn.net/gatieme/article/details/45310493 2017-04-07更新 发现新的工具gtkterm全名叫serial port ... 
- 第12章 网络基础(2)_数据封装和IP地址
			4. 数据封装和IP地址 (1)数据封装 (2)IP地址 ①在TCP/IP网络中,每个主机都有唯一的地址,它是通过IP协议族实现的. ②IP协议要求在每次与TCP/IP网络建立连接时,每台主机都必须为 ... 
- Wndows 下npm 安装依赖时出现错误:MSBUILD : error MSB4132: The tools version "2.0" is unrecognized. Available tools versions are "4.0".
			当在Windows环境中使用npm install或者yarn 安装依赖时,可能会出现如下类似的错误: MSBUILD : error MSB4132: The tools version " ... 
- ORACLE中CONNECT BY...START WITH...的使用
			源: https://docs.oracle.com/cd/B19306_01/server.102/b14200/queries003.htm http://www.cnblogs.com/baiy ... 
- Java技术栈
			内容: 1.Java基础(JavaSE) 2.数据结构与算法与设计模式 3.计算机理论知识 4.数据库 5.Java web(JavaEE) 6.消息队列 7.Linux及服务器相关 8.分布式相关 ... 
- centos73下php5.6安装GD库
			yum --enablerepo=remi-php56 install php-gd php-mysql php-mbstring php-xml php-mcrypt YUM安装的 找到了源 分分 ... 
