Java并发框架——什么是AQS框架

简介: 什么是AQS框架1995年sun公司发布了第一个java语言版本,可以说从jdk1.1到jdk1.4期间java的使用主要是在移动应用和中小型企业应用中,在此类领域中基本不用设计大型并发场景,当然也没有大型互联网公司使用java,因为担心它本身的性能。

什么是AQS框架

1995sun公司发布了第一个java语言版本,可以说从jdk1.1jdk1.4期间java的使用主要是在移动应用和中小型企业应用中,在此类领域中基本不用设计大型并发场景,当然也没有大型互联网公司使用java,因为担心它本身的性能。在互联网及服务器硬件迅猛的发展下,sun公司更加注重企业级应用方面,毫无疑问高并发是一个重要的主题,于是在J2SE5.0jdk1.5)代号为老虎的版本中增加了更加强大的并发相关的操作包——java.util.concurrent。此后java在高并发中表现优异,很多大型互联网公司都使用java作为主要开发语言,例如阿里巴巴、ebay等,这些公司系统的访问绝对是属于世界级的大型并发场景,反映了java在大型并发场景是可行的。Jdk的并发包提供了各种锁及同步机制,其实现的核心类是AbstractQueuedSynchronizer,我们简称为AQS框架,它为不同场景提供了实现锁及同步机制的基本框架,为同步状态的原子性管理、线程的阻塞、线程的解除阻塞及排队管理提供了一种通用的机制。

Jdk的并发包(juc)的作者是Doug Lea,但其中思想却是结合了多位大师的智慧,如果你想深入理解juc的相关理论可以参考Doug Lea写的《The_java.util.concurrent_Synchronizer_Framework》论文。从这里可以找到AQS的理论基础,包括框架的基本原理、需求、设计、实现思路、用法及性能,由于这些方面篇幅较大,本文不打算涉及所有方面,主要将针对AQS类的结构及相关操作进行分析。

 

ASQ将线程封装到一个Node里面,并维护一个CHL Node FIFO队列,它是一个非阻塞的FIFO队列,也就是说在并发条件下往此队列做插入或移除操作不会阻塞,是通过自旋锁和CAS保证节点插入和移除的原子性,实现无锁快速插入。

 

其实AbstractQueuedSynchronizer主要就是维护了一个state属性、一个FIFO队列和线程的阻塞与解除阻塞操作。state表示同步状态,它的类型为32位整型,对state的更新必须要保证原子性。这里的队列是一个双向链表,每个节点里面都有一个prevnext,它们分别是前一个节点和后一个节点的引用。需要注意的是此双向链表除了链头其他每个节点内部都包含一个线程,而链头可以理解为一个空节点。


2-5-5-1

对于队列的结构我们需要深入理解下,图2-5-5-2展示的是组成双向链表其中一个节点的结构,该节点包含五个主要元素,表示的意思如下表,

                                                               

2-5-5-2

 

属性

含义

Node prev

前驱节点,指向前一个节点

Node next

后续节点,指向后一个节点

Node nextWaiter

用于存储condition队列的后续节点

Thread thread

入队列时的当前线程

int waitStatus

有五种状态:

  SIGNAL,值为-1,表示当前节点的后续节点中的线程通过park被阻塞了,当前节点在释放或取消时要通过unpark解除它的阻塞。

  CANCELLED,值为1,表示当前节点的线程因为超时或中断被取消了。

  CONDITION,值为-2,表示当前节点在condition队列中。

  PROPAGATE,值为-3,共享模式的头结点可能处于此状态,表示无条件往下传播,引入此状态是为了优化锁竞争,使队列中线程有序地一个一个唤醒。

  0,除了以上四种状态的第五种状态,一般是节点初始状态。

 

前驱节点prev的引入主要是为了完成超时及取消语义,前驱节点取消后只需向前找到一个未取消的前驱节点即可;后续节点的引入主要是为了优化后续节点的查找,避免每次从尾部向前查找;nextWaiter用于表示condition队列的后续节点,此时prevnext属性将不再使用,而且节点状态处于Node.CONDITION; waitStatus表示的是后续节点状态,这是因为AQS中使用CLH队列实现线程的结构管理,而CLH结构正是用前一节点某一属性表示当前节点的状态,这样更容易实现取消和超时功能。

上面是对节点及节点组成队列的结构的介绍,接着介绍AQS相关的一些操作,包括锁的获取与释放、队列的管理、同步状态的更新、线程阻塞与唤醒、取消中断与超时中断等等。




点击订购作者书籍《Tomcat内核设计剖析》




目录
相关文章
|
26天前
|
算法 Java 数据处理
Java集合框架的优缺点
Java集合框架的优缺点
|
1天前
|
Java 大数据 云计算
Spring框架:Java后台开发的核心
【4月更文挑战第15天】Spring框架在Java后台开发中占据核心位置,因其控制反转(IoC)、面向切面编程(AOP)、事务管理等特性提升效率和质量。Spring提供数据访问集成、RESTful Web服务和WebSocket支持。优势包括高效开发、灵活扩展、强大生态圈和广泛应用。应用于企业级应用、微服务架构及云计算大数据场景。掌握Spring对Java开发者至关重要。
|
4天前
|
存储 Java 编译器
Java集合丛林:深入了解集合框架的秘密
Java集合丛林:深入了解集合框架的秘密
11 0
Java集合丛林:深入了解集合框架的秘密
|
13天前
|
前端开发 安全 Java
使用Java Web框架:Spring MVC的全面指南
【4月更文挑战第3天】Spring MVC是Spring框架的一部分,用于构建高效、模块化的Web应用。它基于MVC模式,支持多种视图技术。核心概念包括DispatcherServlet(前端控制器)、HandlerMapping(请求映射)、Controller(处理请求)、ViewResolver(视图解析)和ModelAndView(模型和视图容器)。开发流程涉及配置DispatcherServlet、定义Controller、创建View、处理数据、绑定模型和异常处理。
使用Java Web框架:Spring MVC的全面指南
|
21天前
|
算法 安全 Java
Java中的并发编程:理解并发性能优化
在当今软件开发领域,多核处理器的普及使得并发编程变得更加重要。本文将深入探讨Java中的并发编程,介绍并发性能优化的关键技术,帮助开发人员更好地利用多核处理器提升应用程序性能。
|
27天前
最全三大框架整合(使用映射)——DeptAction.java
最全三大框架整合(使用映射)——DeptAction.java
3 0
|
27天前
最全三大框架整合(使用映射)——DeptServiceImpl.java
最全三大框架整合(使用映射)——DeptServiceImpl.java
11 0
|
27天前
最全三大框架整合(使用映射)——IDeptService.java
最全三大框架整合(使用映射)——IDeptService.java
5 0
|
Java Linux
Java AQS 实现——Condition
本文着重介绍 AQS 的 Condition 实现方式。
|
7天前
|
存储 Java 数据库连接
java多线程之线程通信
java多线程之线程通信