深入理解AQS之ReentrantLock源码分析

news2024/11/20 23:20:51

        开题:如何自己生成一把独占锁?

           1. 管程 — Java同步的设计思想

        管程:指的是管理共享变量以及对共享变量的操作过程,让他们支持并发。

        互斥:同一时刻只允许一个线程访问共享资源;

        同步:线程之间如何通信、协作。

        MESA模型 

        在管程的发展史上,先后出现过三种不同的管程模型,分别是Hasen模型、Hoare模型和MESA模型。现在正在广泛使用的是 MESA模型
        
        管程中引入了条件变量的概念,而且每个条件变量都对应有一个等待队列。条件变量和等待队列的作用是解决线程之间的同步问题。
        Java实现管程有两种方式:
                1.一种基于Object的Monitor的机制,用于synchronized内置锁实现
                2.抽象队列同步器AQS,用于JUC包下的Lock锁机制的实现

        2. AQS原理分析 

        2.1 什么是AQS

        java.util.concurrent包中的大多数同步器实现都是围绕着共同的基础行为,比如等待队列、条件队列、独占获取、共享获取等,而这些行为的抽象就是基于AbstractQueuedSynchronizer(简称AQS)实现的,AQS是一个抽象同步框架,可以用来实现一个依赖状态的同步器。其实就是类似于管程的思想!

        JDK中提供的大多数的同步器如Lock, Latch, Barrier等,都是基于AQS框架来实现的

                1. 一般是通过一个内部类Sync继承 AQS
                2. 将同步器所有调用都映射到Sync对应的方法

  

        AQS具备的特性:
               1. 阻塞等待队列
               2.  共享/独占
               3.  公平/非公平
               4.  可重入
               5.  允许中断

        2.2 AQS核心结构 

AQS内部维护属性volatile int state(state表示资源的可用状态

State三种访问方式:

        getState()
        setState()
        compareAndSetState ()
定义了两种资源访问方式:
        Exclusive-独占,只有一个线程能执行,如ReentrantLock
        Share-共享,多个线程可以同时执行,如Semaphore/CountDownLatch

AQS实现时主要实现以下几种方法:

        

isHeldExclusively()
该线程是否正在独占资源。只有用到condition才需要去实现它。
tryAcquire(int)
独占方式。 尝试获取资源,成功则返回true,失败则返回false。
tryRelease(int)
独占方式。 尝试释放资源,成功则返回true,失败则返回false。
tryAcquireShared(int)
共享方式。 尝试获取资源。负数表示失败;0表示成功,但没有剩余可用资源;正数表示成功,且有剩余资源。
tryReleaseShared(int)
共享方式。 尝试释放资源,如果释放后允许唤醒后续等待结点返回true,否则返回
false。

 

        2.3 AQS定义两种队列  

        同步等待队列: 主要用于维护获取锁失败时入队的线程。

        条件等待队列: 调用await()的时候会释放锁,然后线程会加入到条件队列,调用signal()唤醒的时候会把条件列中的线程节点移动到同步队列中,等待再次获得锁。

        

AQS 定义了5个队列中节点状态:
        1. 值为0,初始化状态,表示当前节点在sync队列中,等待着获取锁。
        2. CANCELLED,值为1,表示当前的线程被取消;
        3. SIGNAL,值为-1,表示当前节点的后继节点包含的线程需要运行,也就是unpark;
        4. CONDITION,值为-2,表示当前节点在等待condition,也就是在condition队列中;
        5. PROPAGATE,值为-3,表示当前场景下后续的acquireShared能够得以执行;

同步等待队列  

        AQS当中的同步等待队列也称CLH队列,CLH队列是Craig、Landin、Hagersten三人发明的一种基于双向链表数据结构的队列是FIFO先进先出线程等待队列,Java中的CLH队列是原CLH队列的一个变种,线程由原自旋机制改为阻塞机制.

        1、当前线程如果获取同步状态失败时,AQS则会将当前线程已经等待状态等信息构造成一个节点(Node)并将其加入到CLH同步队列,同时会阻塞当前线程

        2、当同步状态释放时,会把首节点唤醒(公平锁),使其再次尝试获取同步状态。
        3、通过signal或signalAll将条件队列中的节点转移到同步队列。( 由条件队列转化为同步队列

条件等待队列

AQS中条件队列是使用单向列表保存的,用nextWaiter来连接:

      1. 调用await方法阻塞线程;
      2. 当前线程存在于同步队列的头结点,调用await方法进行阻塞( 从同步队列转化到条件队列

        3. ReentrantLock源码分析

        ReentrantLock是一种基于AQS框架的应用实现 ,是JDK中的一种线程并发访问的同步手段,它的功能类似于synchronized 是一种互斥锁,可以保证线程安全
ReentrantLock基本使用方式
         源码阅读过程中要关注的问题

                1.公平和非公平锁,可重入锁是如何实现的

                2.设计的精髓:并发场景下入队和出队操作是如何设计的

                        线程竞争锁失败入队阻塞逻辑实现
                        释放锁的线程唤醒阻塞线程出队竞争锁的逻辑实现

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1088398.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【测试】丝滑版本测试记录2023-10-13

目录 四组24个视频拉取 视频拉取的带宽 本地内存不足 四组24个视频拉取 视频拉取的带宽 本地内存不足 由于 edge需要内存大几百M,加截wasm要更多一点,只剩下 400M,不足以使用

git+gitee代码上传

gitgitee代码上传 1、git应用工具下载安装 gitee应用注册并创建仓库点创建后进入到仓库 git命令关于.gitignore只执行一次的命令经常执行的命令 1、git应用工具 下载安装 https://git-scm.com/downloads $ git --version git version 2.39.0.windows.2代码仓库: …

全力以赴,火山引擎边缘云代表团出战亚运会

END 未来,火山引擎边缘云赛事阵容将继续全力以赴,通过领先、可信赖的云和智能技术,助力游戏行业呈现更加精彩的竞技赛事。

LeetCode【240】搜索二维矩阵

题目&#xff1a; 思路&#xff1a; 1、单靠对角线元素无法判定位置 2、主要逐行进行二分 代码&#xff1a; public boolean searchMatrix(int[][] matrix, int target) {int rows matrix.length;int columns matrix[0].length;// 按行进行二分for (int i 0; i < rows…

Apipost连接数据库详解

Apipost提供了数据库连接功能&#xff0c;在接口调试时可以使用数据库获取入参或进行断言校验。目前的Apipost支持&#xff1a;Mysql、SQL Sever、Oracle、Clickhouse、达梦数据库、PostgreSQL、Redis、MongoDB 8种数据库的连接操作 新建数据库连接&#xff1a; 在「项目设置…

ue5蓝图请求接口

安装与使用 1、在虚幻商城搜索 VaRest 插件 2、选择自己项目的对应版本安装 3、查看是否安装成功 4、进入项目后,分别启动VaRest、JSON Blueprint Utilities两个插件(勾选后会提示重启项目) 5、基本用法:打开关卡蓝图使用(url改为自己的接口、Verb是请求方式) 5.1、或者…

了解什么是JWT

目录 JWT 是什么 有什么用 Jwt的使用 依赖 工具类 过滤器 控制器 配置 测试类 案列 JWT 是什么 JWT是指JSON Web Token&#xff0c;它是一种用于在网络应用间安全传递信息的开放标准&#xff08;RFC 7519&#xff09;。JWT通过使用私钥对JSON数据进行签名或者使用公钥…

蜘蛛飞机大战

欢迎来到程序小院 蜘蛛飞机大战 玩法&#xff1a; 点击开始游戏&#xff0c;鼠标移动控制方向&#xff0c;可自由移动飞机打剁掉方飞机下落的子弹并打掉敌方飞机&#xff0c;三次生命&#xff0c;不同关卡不同奖励&#xff0c;快去闯关吧^^。开始游戏https://www.ormcc.com/pl…

高数笔记03:几何、物理应用

图源&#xff1a;文心一言 本文是我学习高等数学几何、物理应用的一些笔记和心得&#xff0c;希望可以与考研路上的小伙伴一起努力上岸~~&#x1f95d;&#x1f95d; 第1版&#xff1a;查资料、画导图~&#x1f9e9;&#x1f9e9; 参考资料&#xff1a;《高等数学 基础篇》武…

计算机操作系统-第五天

目录 1、系统调用 什么是系统调用&#xff1f;有何作用&#xff1f; 系统调用与库函数的区别&#xff1a; 为什么系统调用是必须的&#xff1f; 什么功能要用到系统调用&#xff1f; 系统调用的过程&#xff1a; 1、系统调用 什么是系统调用&#xff1f;有何作用&#…

如何通过 NFTScan API 按照 NFT 合约地址检索数据?

在当前 NFT 市场还在不断扩张的背景下&#xff0c;各种 NFT 项目依旧是井喷式涌现&#xff0c;投资者和开发者都面临获取项目全貌数据的困境。公链上提取和处理大量的数据既费时又费力&#xff0c;缺乏全面的信息支持&#xff0c;将难以深入判断一个 NFT 项目的真实情况&#x…

Vite项目打包构建优化(视图分析、CDN引入)

使用rollup-plugin-visualizer插件先分析模块占用空间 安装依赖&#xff1a;pnpm i rollup-plugin-visualizervite配置&#xff1a; plugins: [vue(), visualizer({filename: analysis.html, // 分析图生成的文件名open:true // 如果存在本地服务端口&#xff0c;将在打包后自…

Photoshop Lightroom 2024 (Lr2024)最新安装特别版

Adobe Photoshop Lightroom 2024是一款由Adobe Systems公司发布的软件&#xff0c;其英文直译为“明室”&#xff0c;也常被称为数码暗房。它主要用于图片管理和后期润色&#xff0c;包括图片导入、整理、编辑、导出等全过程&#xff0c;不仅可以对图片进行编辑&#xff0c;还可…

linux usb驱动移植(1)

1. USB总线 1.1 usb总线定义 在linux 设备模型中&#xff0c;总线由bus_type 结构表示&#xff0c;我们所用的 I2C、SPI、USB 都是用这个结构体来定义的。该结构体定义在 include/linux/device.h文件中&#xff1a; struct bus_type {const char *name;const c…

WiFi 6在工业物联网应用中有哪些优势?

Wi-Fi 6 (802.11ax)作为新一代应用成熟的无线通信技术&#xff0c;也被越来越广泛地部署在工业物联网中。WiFi 6 相比其前身 Wi-Fi 5 (802.11ac) 进行了多方面的改进提升&#xff0c;非常适合工业环境的苛刻要求。现在也有许多工业网关支持WiFi 6无线技术标准&#xff0c;为工业…

kantts docker化

kan-tts docker本地化 环境安装 下载docker镜像(python3.8的) registry.cn-hangzhou.aliyuncs.com/modelscope-repo/modelscope:ubuntu20.04-cuda11.8.0-py38-torch2.0.1-tf2.13.0-1.9.2 安装基础模型 pip install modelscope 安装语音模型 pip install "modelscope…

KubeSphere 社区双周报 | FluentBit 新增 tcp 输入插件 | 2023.09.29-10.12

KubeSphere 社区双周报主要整理展示新增的贡献者名单和证书、新增的讲师证书以及两周内提交过 commit 的贡献者&#xff0c;并对近期重要的 PR 进行解析&#xff0c;同时还包含了线上/线下活动和布道推广等一系列社区动态。 本次双周报涵盖时间为&#xff1a;2023.09.29-2023.…

2023年09月 C/C++(五级)真题解析#中国电子学会#全国青少年软件编程等级考试

C/C++编程(1~8级)全部真题・点这里 Python编程(1~6级)全部真题・点这里 第1题:红与黑 有一间长方形的房子,地上铺了红色、黑色两种颜色的正方形瓷砖。你站在其中一块黑色的瓷砖上,只能向相邻的黑色瓷砖移动。请写一个程序,计算你总共能够到达多少块黑色的瓷砖。 时间限…

【已解决】MySQL:执行sql查询出错误数据(MySQL隐藏机制-类型转换导致)

目录 问题现象&#xff1a; 问题分析&#xff1a; 结论&#xff1a; 解决方法&#xff1a; 拓展&#xff1a; 问题现象&#xff1a; 今天在项目开发中发现了一个非常奇怪的bug&#xff1a; 如图&#xff0c;我在数据库中以“dept_id 1712651046956421123”为条件&#xff…

【强烈推荐】免费的PDF工具,包括PDF拆分/分割、转WORD等功能的免费在线软件工具,救了大命,找了半天什么pdf365、福xipdf、还有哔果pdf全是打着免费名义收费,烦死了

PDF拆分 - 图文工具箱 - imgtool.net&#xff0c;嘎嘎好用&#xff0c;主要是免费 除此之外&#xff0c;还有其他的功能&#xff0c;需要的可以去看看