本来准备写一篇AQS的完成解析,已经写了大部分了,但是觉得写得实在太乱了,而且很多细节的东西很难讲清楚,所以还是决定先写一些前文,都是属于AQS整体的一部分,也都是AQS的灵魂组件,所以单拎出来说一下。
本文先争取将贯穿AQS的一个组件先讲清楚。好了,直接进入本文的主题,AQS的内部类--Node
(一) Node是什么,为什么这么重要
Node是AQS中的一个静态的内部类,之所以说贯穿了AQS的整个实现是因为AQS是一个竞争锁的并发框架, 有竞争就会有失败,所以所有的失败的节点都会以Node的形式,等待在等待者队列中,知道放弃竞争了,或者竞争成功。
构建Node的时候都需要两个参数,一个是Thread,标识是哪个线程在等待,那当轮到你竞争的时候也会知道去唤醒哪个Thread进行工作,还有一个是Node.mode,这个是Node内部实现的标识当前Node是数据哪种竞争模式的,有两种不同的模式,独占模式(exclusive)和共享模式(Shared)
独占模式:资源是独占的,一次只能一个线程获取。
共享模式:同时可以被多个线程获取,具体的资源的个数可以通过参数指定。
直接看一下Node的代码
static final class Node {
//标识为共享模式
static final Node SHARED = new Node();
//标识为独占模式
static final Node EXCLUSIVE = null;
/**
* 以下四个都是Node的状态
/
// 标识当前Node取消了竞争
static final int CANCELLED = 1;
// 表示Node的后继结点可以被唤醒了
static final int SIGNAL = -1;
// 表示现在Node阻塞者等待某些条件满足
static final int CONDITION = -2;
// #TODO
static final int PROPAGATE = -3;
volatile int waitStatus;
// 在等待队列中的前一个节点
volatile Node prev;
// 在等待队列中的后一个节点
volatile Node next;
// 执行的线程
volatile Thread thread;
Node nextWaiter;
final boolean isShared() {
return nextWaiter == SHARED;
}
Node() { // Used to establish initial head or SHARED marker
}
Node(Thread thread, Node mode) { // Used by addWaiter
this.nextWaiter = mode;
this.thread = thread;
}
Node(Thread thread, int waitStatus) { // Used by Condition
this.waitStatus = waitStatus;
this.thread = thread;
}
}
// 等待队列中的首节点
private transient volatile Node tail;
// 等待队列中的尾节点
private transient volatile Node head;
所以,根据定义我们可以画出AQS中等待者队列的模型
(二) Node的用处
在本系列的后面的文章中,我们会讲到,跟Node的模式分配一样,抢占资源也会有独占式和共享式的方法入口,AQS也留了供用户自定义的抢占逻辑方法。所以Node在整个框架中哪里用到呢?我们可以先自己想一下,如果自己设计一个最简单的抢占模型会怎么设计?肯定会有下面几个步骤
1: 提供一个资源供大家抢占,假设初始状态为1,被占用后设置为0.所以假设有多个线程去获取这个资源的时候,肯定会只有一个线程能抢占成功,那么其他的线程必须按序排好。同时也要考虑到多个节点往队伍中排会出现的并发问题
2: 当上一个节点消费完成后,要将资源释放出来,然后要通知排在队伍中的第一个节点,通知他可以开始竞争资源了。
在AQS框架中,大致的逻辑和我们想的差不多,而Node在其中扮演的就是作为在等待队伍中排队的节点的角色。然后节点中维护了前后节点的指针,所以可以在资源使用结束后通知排在后面的节点开始抢占。
分享到:
相关推荐
Java并发编程中的`JUC`(Java Util Concurrency)库是Java平台中用于处理多线程问题的核心工具包,它提供了一系列高效、线程安全的工具类,帮助开发者编写并发应用程序。`AQS`(AbstractQueuedSynchronizer)是JUC库中的...
Java并发包(java.util.concurrent,简称JUC)提供了一系列工具和类库来帮助开发者简化并发编程的工作。其中,AbstractQueuedSynchronizer(简称AQS)是构建各种同步器的核心组件。 AQS是一个抽象的队列同步器,它...
### Java并发编程-AQS和JUC实战 #### 一、ReentrantLock 重入锁 **1.1 概述** - **基本介绍**: `ReentrantLock` 是一个实现了 `Lock` 接口的可重入互斥锁,提供比 `synchronized` 更丰富的功能。与 `synchronized...
### JUC并发编程中的虚假唤醒及其解决方案 #### 一、虚假唤醒的概念与原理 在Java并发编程中,尤其是在处理多线程同步时,一个重要的概念是“虚假唤醒”(Spurious Wakeup)。这是一种较为罕见的现象,但在实际...
juc 的aqs介绍。
1. **状态管理**:AQS的状态字段是一个32位的整数,可以用于表示各种同步状态,例如锁的持有数量。线程通过CAS(Compare And Swap)操作来改变这个状态,确保操作的原子性。 2. **等待队列**:AQS内部维护了一个...
JUC(Java.util.concurrent)是Java并发编程库的一个重要组成部分,专门提供了在多线程环境下用于控制并发执行的工具类和接口。本篇内容将详细介绍JUC中的一些核心组件及其使用方法,包括CountDownLatch、Executors...
自己学习过程对Java JUC包知识的总结,看完并理解基本能应付各种基本的问题点,墙裂推荐分享 博客跳转链接: https://blog.csdn.net/qq_35642036/article/details/82767070
### Java多线程和JUC知识点详解 #### Lambda表达式与函数式编程 Lambda表达式是Java 8引入的一个重要特性,它支持将函数作为参数传递到方法中,极大地简化了代码编写。Lambda表达式的使用使得Java语言更加简洁、易...
根据提供的文档内容,以下是关于Java多线程并发编程与JUC知识点的详细解读: 1. 线程的状态 Java线程在其生命周期中可以拥有不同的状态。线程可能处于以下几种状态: - 新建(New):线程被创建时的状态。 - 就绪...
Java的并发编程是多线程和多任务处理的核心技术之一,而在Java并发包 java.util.concurrent 中,AQS(AbstractQueuedSynchronizer)扮演了至关重要的角色。AQS是一种框架,用来构建锁或其他同步组件的基础。它提供了...
Java并发编程是Java开发中的重要领域,而Java并发工具包(Java Concurrency Utility,简称JUC)则是Java标准库提供的一套强大而丰富的工具,它极大地简化了多线程环境下的编程工作。JUC主要包含在`java.util....
1、Java并发体系-第一阶段-多线程基础知识 2、Java并发体系-第二阶段-锁与同步-[1] 3、Java并发体系-第二阶段-锁与同步-[2] 4、Java并发体系-第二阶段-锁与同步-[3] 5、Java并发包-第三阶段-JUC并发包-[1] 6、...
AQS作为Java并发工具包(JUC)中的一个核心抽象类,其设计目的是为了实现各种同步器(如锁、信号量等)。AQS主要通过三个核心组成部分来实现这些同步组件的功能: 1. **State变量及其CAS操作**:AQS维护了一个名为`...
java8 源码 #juc多线程 java.util.concurrent(并发) ##概念复习 进程:正在进行中的程序 线程:进程当中的一个执行单元 关系: 进程包含线程 面试问题: 日常使用进程/线程的案例或者case ###线程的各种状态: Thread....
Java并发编程库(Java Util Concurrency,简称JUC)是Java平台中用于高效并发处理的重要工具包,包含在`java.util.concurrent`包下。JUC提供了丰富的并发原语,如线程池、同步器、并发容器等,极大地简化了多线程...
Java-JUC-多线程进阶 Java-JUC-多线程进阶resources是 Java 并发编程的高级课程,涵盖了 Java 中的并发编程概念、线程安全、锁机制、集合类、线程池、函数式接口、Stream流式计算等多个方面。 什么是JUC JUC...
AQS源码分析一、锁的介绍1.1 乐观锁/悲观锁1.2 共享锁/独占锁1.3 公平锁/非公平锁1.4 小结二、AQS框架结构介绍2.1 类图2.2 AQS数据结构三、源码详解3.1 acquire源码详解3.2 release源码详解四、从ReentranLock看公平...
尚硅谷作为一家知名的IT在线教育平台,提供了丰富的Java编程课程资源,其中“尚硅谷Java视频_JUC视频教程”是针对Java并发编程的一个系列教程。该教程旨在帮助学习者掌握Java多线程编程的核心技术和高级特性,通过一...