ReentrantLock与AQS:深入剖析多线程同步的艺术

2024-06-14 20:28

本文主要是介绍ReentrantLock与AQS:深入剖析多线程同步的艺术,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1. 概述

ReentrantLock作为Java的独享锁,其实现基于AbstractQueuedSynchronizer(AQS)。AQS为构建锁和同步器提供了一个框架,包括资源的获取、释放、线程的排队等待等机制。


2. 入队与出队

在AQS中,等待获取锁的线程会被封装成Node节点,并加入到一个FIFO的队列中。当线程尝试获取锁失败时,会执行入队操作。入队操作主要包括将节点添加到队列尾部,并更新尾指针和可能的下一个节点的prev指针。

出队操作则发生在锁被释放时,此时AQS会唤醒队列中的第一个节点(头节点)所代表的线程,并尝试让其获取锁。如果成功获取锁,则执行出队操作,即将头节点移除,并更新头指针和可能的下一个节点的next指针。


3. 头结点设计

AQS中的队列是一个双向链表,其中头结点(head)用于表示队列中等待时间最长的线程,也是每次尝试获取锁的第一个线程。当线程成功获取锁后,它会被移除队列,此时头指针会向前移动,指向下一个等待的线程。


4. 共享与独享的实现

AQS支持两种同步模式:共享模式和独享模式。独享模式即ReentrantLock使用的模式,一个时间只能有一个线程获取到锁。而共享模式则允许多个线程同时获取锁,如SemaphoreCountDownLatch就是基于共享模式实现的。

在独享模式下,AQS通过tryAcquire()tryRelease()等方法来尝试获取和释放锁。而在共享模式下,AQS则通过tryAcquireShared()tryReleaseShared()等方法来实现。


5. CAS操作

CAS(Compare-and-Swap)是AQS中实现原子操作的关键技术。CAS操作包含三个操作数:内存位置(V)、预期原值(A)和新值(B)。CAS操作会先检查内存位置V的值是否等于预期原值A,如果相等,则将V的值更新为新值B,并返回true;否则不做任何操作,并返回false。

在AQS中,CAS操作主要用于状态变量的更新和节点的入队、出队等。例如,在入队操作中,AQS会使用CAS操作来尝试更新尾指针和节点的prev指针,以确保在多线程环境下的线程安全。


6. 源码分析

ReentrantLock的实现依赖于AbstractQueuedSynchronizer(AQS),而AQS是一个用于构建锁和同步器的框架。在源码中,我们可以观察到几个关键部分:Node类、同步状态管理、队列操作、以及锁获取与释放的实现。

6.1 Node类

Node类用于表示队列中的节点,每个节点包含线程引用、等待状态等信息。Node类有多个状态值,如CANCELLED、SIGNAL、CONDITION等,用于标识节点的不同状态。

static final class Node {  // 线程状态枚举  static final int CANCELLED =  1;  static 

这篇关于ReentrantLock与AQS:深入剖析多线程同步的艺术的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1061425

相关文章

基于MySQL Binlog的Elasticsearch数据同步实践

一、为什么要做 随着马蜂窝的逐渐发展,我们的业务数据越来越多,单纯使用 MySQL 已经不能满足我们的数据查询需求,例如对于商品、订单等数据的多维度检索。 使用 Elasticsearch 存储业务数据可以很好的解决我们业务中的搜索需求。而数据进行异构存储后,随之而来的就是数据同步的问题。 二、现有方法及问题 对于数据同步,我们目前的解决方案是建立数据中间表。把需要检索的业务数据,统一放到一张M

服务器集群同步时间手记

1.时间服务器配置(必须root用户) (1)检查ntp是否安装 [root@node1 桌面]# rpm -qa|grep ntpntp-4.2.6p5-10.el6.centos.x86_64fontpackages-filesystem-1.41-1.1.el6.noarchntpdate-4.2.6p5-10.el6.centos.x86_64 (2)修改ntp配置文件 [r

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

深入探索协同过滤:从原理到推荐模块案例

文章目录 前言一、协同过滤1. 基于用户的协同过滤(UserCF)2. 基于物品的协同过滤(ItemCF)3. 相似度计算方法 二、相似度计算方法1. 欧氏距离2. 皮尔逊相关系数3. 杰卡德相似系数4. 余弦相似度 三、推荐模块案例1.基于文章的协同过滤推荐功能2.基于用户的协同过滤推荐功能 前言     在信息过载的时代,推荐系统成为连接用户与内容的桥梁。本文聚焦于

【C++高阶】C++类型转换全攻略:深入理解并高效应用

📝个人主页🌹:Eternity._ ⏩收录专栏⏪:C++ “ 登神长阶 ” 🤡往期回顾🤡:C++ 智能指针 🌹🌹期待您的关注 🌹🌹 ❀C++的类型转换 📒1. C语言中的类型转换📚2. C++强制类型转换⛰️static_cast🌞reinterpret_cast⭐const_cast🍁dynamic_cast 📜3. C++强制类型转换的原因📝

深入手撕链表

链表 分类概念单链表增尾插头插插入 删尾删头删删除 查完整实现带头不带头 双向链表初始化增尾插头插插入 删查完整代码 数组 分类 #mermaid-svg-qKD178fTiiaYeKjl {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-

深入理解RxJava:响应式编程的现代方式

在当今的软件开发世界中,异步编程和事件驱动的架构变得越来越重要。RxJava,作为响应式编程(Reactive Programming)的一个流行库,为Java和Android开发者提供了一种强大的方式来处理异步任务和事件流。本文将深入探讨RxJava的核心概念、优势以及如何在实际项目中应用它。 文章目录 💯 什么是RxJava?💯 响应式编程的优势💯 RxJava的核心概念

多线程解析报表

假如有这样一个需求,当我们需要解析一个Excel里多个sheet的数据时,可以考虑使用多线程,每个线程解析一个sheet里的数据,等到所有的sheet都解析完之后,程序需要提示解析完成。 Way1 join import java.time.LocalTime;public class Main {public static void main(String[] args) thro

深入理解数据库的 4NF:多值依赖与消除数据异常

在数据库设计中, "范式" 是一个常常被提到的重要概念。许多初学者在学习数据库设计时,经常听到第一范式(1NF)、第二范式(2NF)、第三范式(3NF)以及 BCNF(Boyce-Codd范式)。这些范式都旨在通过消除数据冗余和异常来优化数据库结构。然而,当我们谈到 4NF(第四范式)时,事情变得更加复杂。本文将带你深入了解 多值依赖 和 4NF,帮助你在数据库设计中消除更高级别的异常。 什么是

Java 多线程概述

多线程技术概述   1.线程与进程 进程:内存中运行的应用程序,每个进程都拥有一个独立的内存空间。线程:是进程中的一个执行路径,共享一个内存空间,线程之间可以自由切换、并发执行,一个进程最少有一个线程,线程实际数是在进程基础之上的进一步划分,一个进程启动之后,进程之中的若干执行路径又可以划分成若干个线程 2.线程的调度 分时调度:所有线程轮流使用CPU的使用权,平均分配时间抢占式调度