多线程(九、AQS原理-简介)

AQS介绍

AQS是一个抽象类,提供了一套通用的控制同步状态,线程阻塞/唤醒,等待队列管理的操作。

平时用的ReentrantLock,CountDownLatch,Semaphore(信号量)都是基于AQS提供API来实现的,他们的不同之处就是对于AQS内部的同步状态(synchronization state,int类型)操作不同,来实现的功能不同。

AQS基于同步状态(synchronization state)主要解决了3个问题:

1、资源的访问是共享的还是独占的,比方说ReentrantLock是独占的,ReentrantReadWriteLock.ReadLock是共享的

2、如何管理等待的线程,使用等待队列

3、无法获取资源,线程的超时和中断机制

AQS的主要方法

如何使用同步状态(synchronization state)才是继承AQS的使用者考虑的问题。

AQS暴露给子类可以使用的方法如下:

1、tryAcquire 独占资源获取
2、tryRelease 独占资源释放
3、tryAcquireShared 共享资源获取
4、tryReleaseShared 共享资源释放
5、isHeldExclusively 是否占用独占资源

AQS框架内部通过一个内部类ConditionObject,实现了Condition接口,以此来为子类提供条件等待的功能。

AQS的内部私有方法:

关于同步状态(synchronization state)AQS提供了3个方法

1、setState 设置同步状态
2、getState 获取同步状态
3、CAS的compareAndSetState 基于unsafe的CAS设置同步状态

等待队列的方法

1、enq 入队操作指定节点(后面介绍),可以进行初始化
2、addWaiter 入队操作节点,节点是当前线程
3、setHead 设置头节点
4、unparkSuccessor 唤醒当前节点的后继节点
5、doReleaseShared 释放共享节点
6、setHeadAndPropagate 设置头节点,并依次唤醒后继节点

操作资源的方法

1、acquire public final 独占地获取资源
2、acquireInterruptibly public final 独占地获取资源(响应中断)
3、acquireInterruptibly public final 独占地获取资源(限时等待)
4、acquireShared public final 共享地获取资源
5、acquireSharedInterruptibly public final 共享地获取资源(响应中断)
6、tryAcquireSharedNanos public final 共享地获取资源(限时等待)
7、等等等........

等待队列

等待队列是以节点(Node)为单位,节点里包装了线程。

节点有2种类型,共享节点和独占节点,独占和共享

节点状态(waitStatus),共享节点和独占节点的状态使用值是不一样的。

1、节点默认状态为0。

2、其中独占结点使用其中的CANCELLED(1)、SIGNAL(-1)、CONDITION(-2),共享结点使用其中的CANCELLED(1)、SIGNAL(-1)、PROPAGATE(-3)。

原文地址:https://blog.51cto.com/janephp/2405825

时间: 2024-10-17 15:57:30

多线程(九、AQS原理-简介)的相关文章

AQS 原理以及 AQS 同步组件总结

1 AQS 简单介绍 AQS 的全称为(AbstractQueuedSynchronizer),这个类在 java.util.concurrent.locks 包下面. AQS 是一个用来构建锁和同步器的框架,使用 AQS 能简单且高效地构造出应用广泛的大量的同步器,比如我们提到的 ReentrantLock,Semaphore,其他的诸如 ReentrantReadWriteLock,SynchronousQueue,FutureTask 等等皆是基于 AQS 的.当然,我们自己也能利用 AQ

多线程断点下载原理(java代码实例演示)

其实多线程断点下载原理,很简单的,那么我们就来先了解下,如何实现多线程的断点下载,首先:你必须明白第一点,那么就是,什么是多线程下载,该知识点可以查看本博客上一篇文章,Android之多线程下载原理,断点下载呢,其实就是在这个的基础之上添加了一些东西,那么添加了什么东西了,现在来做一个详细的了解. 1.在下载的过程中,边下载,变用一个文件来记录下载的位置,也就是下载了多少的数据 1.创建文件 2.记录下载多少数据 3.存储数据 2.第二次下载的时候,就去读取文件中是否存有数据,读取上次下载的位置

【转】浏览器的渲染原理简介

How Browsers Work 这篇文章把浏览器的很多细节讲的很细,也有中文的翻译版本,现在转载的这篇是陈皓写的,目的的为了能在上班途中,或是坐马桶时就能读完,并能从中学会一些能用在工作上的东西. 浏览器工作大流程 先看个图 从图中,可以看到: 1) 浏览器会解析三个东西 * 一个 HTML/SVG/XHTML,事实上,Webkit 有三个C++的类对应这三类文档.解析这三种文件会产生一个DOM Tree * CSS,解析CSS会产生CSS规则树 * JavaScript 脚本,主要是通过

pyspark原理简介

概述 这是前段时间在看spark的python支持的时候,简单过了一下pyspark里的python代码,整理了一个大致流程.虽然几乎不会python,但基本上能看懂pyspark是怎么让不同虚拟机之间传输数据的.如何在python环境调用java类的.pyspark SDK的丰富程度取决于什么.需要做些什么流程和封装等. 我看了下,应该只有Pyspark Internals这篇wiki里介绍了pyspark的实现机制,大体是下面这张图就可以表示: 在python driver端,SparkCo

Linux驱动程序工作原理简介

转自:http://blog.sina.com.cn/s/blog_55465b470100ri1e.html 一.linux驱动程序的数据结构      二.设备节点如何产生?      三.应用程序是如何访问设备驱动程序的?      四.为什么要有设备文件系统?      五.设备文件系统如何实现?      六.如何使用设备文件系统?      七.具体设备驱动程序分析      1.      驱动程序初始化时,要注册设备节点,创建子设备文件      2.      驱动程序卸载时要

(转载)Android显示原理简介

Android应用程序显示的过程:Android应用程序调用SurfaceFlinger服务把经过测量.布局和绘制后的Surface渲染到显示屏幕上. 名词解释 SurfaceFlinger:Android系统服务,负责管理Android系统的帧缓冲区,即显示屏幕. Surface:Android应用的每个窗口对应一个画布(Canvas),即Surface,可以理解为Android应用程序的一个窗口. Android应用程序的显示过程包含了两个部分(应用侧绘制.系统侧渲染).两个机制(进程间通讯

NAT原理简介和virtualbox当中的NAT实现

NAT原理简介 NAT英文全称是“Network Address Translation”,中文意思是“网络地址转换”,它是一个IETF(Internet Engineering Task Force, Internet工程任务组)标准,允许一个整体机构以一个公用IP(Internet Protocol)地址出现在Internet上.顾名思义,它是一种把内部私有网络地址(IP地址)翻译成合法网络IP地址的技术.如图: 简单地说,NAT就是在局域网内部网络中使用内部地址,而当内部节点要与外部网络进

iptables原理简介

1.iptables防火墙简介 Iptables也叫netfilter是Linux下自带的一款免费且优秀的基于包过滤的防火墙工具,它的功能十分强大,使用非常灵活,可以对流入.流出.流经服务器的数据包进行精细的控制.iptables是Linux2.4及2.6内核中集成的模块. 2.Iptables服务相关命令 查看iptables状态 service iptables status 开启/关闭iptables service iptables start service iptables stop

Socket通信原理简介

Socket通信原理简介 字数1011 阅读1766 评论2 喜欢11 何谓socket 计算机,顾名思义即是用来做计算.因而也需要输入和输出,输入需要计算的条件,输出计算结果.这些输入输出可以抽象为I/O(input output). Unix的计算机处理IO是通过文件的抽象.计算机不同的进程之间也有输入输出,也就是通信.因此这这个通信也是通过文件的抽象文件描述符来进行. 在同一台计算机,进程之间可以这样通信,如果是不同的计算机呢?网络上不同的计算机,也可以通信,那么就得使用网络套接字(soc