Java并发篇--AQS原理

AQS原理

概述

全称是 AbstractQueuedSynchronizer,是阻塞式锁和相关的同步器工具的框架

特点:

用 state 属性来表示资源的状态(分独占模式和共享模式),子类需要定义如何维护这个状态,控制如何获取锁和释放锁

​ · getState - 获取 state 状态

​ · setState - 设置 state 状态

​ · compareAndSetState - cas 机制设置 state 状态

​ · 独占模式是只有一个线程能够访问资源,而共享模式可以允许多个线程访问资源

提供了基于 FIFO 的等待队列,类似于 Monitor 的 EntryList

条件变量来实现等待、唤醒机制,支持多个条件变量,类似于 Monitor 的 WaitSet

子类主要实现这样一些方法(默认抛出 UnsupportedOperationException)

​ · tryAcquire

​ · tryRelease

​ · tryAcquireShared

​ · tryReleaseShared

​ · isHeldExclusively

获取锁的写法

// 如果获取锁失败
if (!tryAcquire(arg)) {// 入队, 可以选择阻塞当前线程 park unpark
}

释放锁的写法

// 如果释放锁成功
if (tryRelease(arg)) {// 让阻塞线程恢复运行
}

实现不可重入锁

自定义同步器

// 独占锁
class MySync extends AbstractQueuedSynchronizer{@Override// 尝试获取锁protected boolean tryAcquire(int arg) {if(compareAndSetState(0,1)){// 加上锁了,并设置owner为当前线程setExclusiveOwnerThread(Thread.currentThread());return true;}return false;}@Override// 尝试释放锁protected boolean tryRelease(int arg) {setExclusiveOwnerThread(null);setState(0);return true;}@Override// 是否持有独占锁protected boolean isHeldExclusively() {return getState() == 1;}public Condition newCondition(){return new ConditionObject();}
}

自定义锁

有了自定义同步器,很容易复用 AQS ,实现一个功能完备的自定义锁

// 自定义锁(不可重入锁)
class MyLock implements Lock{// 独占锁class MySync extends AbstractQueuedSynchronizer{...}private MySync sync = new MySync();@Override// 加锁 (不成功就会进入等待队列等待)public void lock() {sync.acquire(1);}@Override// 加锁,可打断public void lockInterruptibly() throws InterruptedException {sync.acquireInterruptibly(1);}@Override// 尝试加锁 (只会尝试一次)public boolean tryLock() {return sync.tryAcquire(1);}@Override// 尝试加锁,有超时的public boolean tryLock(long time, TimeUnit unit) throws InterruptedException {return sync.tryAcquireNanos(1,unit.toNanos(time));}@Override// 解锁public void unlock() {sync.release(1);}@Override// 创建条件变量(类似synchronized 中的 wait set)public Condition newCondition() {return sync.newCondition();}
}

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

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

相关文章

TypeScript在现代前端开发中的应用

💓 博客主页:瑕疵的CSDN主页 📝 Gitee主页:瑕疵的gitee主页 ⏩ 文章专栏:《热点资讯》 TypeScript在现代前端开发中的应用 TypeScript在现代前端开发中的应用 TypeScript在现代前端开发中的应用 引言 TypeScript 概述…

代码随想录训练营Day24 | 134. 加油站 - 135. 分发糖果 - 860.柠檬水找零 - 406.根据身高重建队列

134. 加油站 题目链接:134. 加油站 思路: 由题意可得,需要能够走完所有的加油站,就需要保证车到达每一个加油站的时候有油,故先对gas和cost数组做差,得到每个加油站的油差,正代表着车在这里能加…

Burp Suite 专业版使用【Mac版本 m1处理器】

前言 Burp Suite 专业版(Professional)是需要付费使用的,但是社区版(Community)是免费的,下图第一个下拉框可以切换专业版和社区版本。 Burp Suite 专业版如果没有License key,是不能正常使用的,下边是在没有购买License key的情况下使用Burp Suite 专业版的方法。 本文是…

【MySQL 保姆级教学】事务的隔离级别(详细)--下(13)

事务的隔离级别 1. 如何理解事务的隔离性2. 事务隔离级别的分类3. 查看和设置事务隔离级别3.1 全局和会话隔离级别3.2 查看和设置隔离级别 4. 事务隔离级别的演示4.1 读未提交(Read Uncommitted)4.2 读已提交(Read Committed)4.3 …

【热门主题】000044 大数据治理:开启数据时代新征程

前言:哈喽,大家好,今天给大家分享一篇文章!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏关注哦 💕 目录 【热…

JavaWeb后端开发知识储备1

目录 1.DTO/VO/PO 2.MVC架构/微服务架构 3.JWT令牌流程 4.ThreadLocal 5.接口路径/路径参数 1.DTO/VO/PO 1.1 DTO DTO 即 Data Transfer Object—— 数据传输对象,是用于传输数据的对象,通常在服务层与表现层之间传递数据,DTO 通常用于…

35岁程序员的四条职业发展路径:提前规划,迎接新起点

引言 20多岁:初入职场,怀揣梦想,对未来充满期待。30多岁:面临家庭与事业的双重压力,开始感到迷茫与焦虑。40岁:步入中年,如何在激烈的职场竞争中保持优势,继续书写精彩人生&#xf…

C++提高编程-泛型编程

一、模板: 1.1.模板的概念: 1.模板就是建立通用的模具,大大提高复用性2.例如生活中的模板: 一寸照片模板: PPT模板: 模板的特点: 模板不可以直接使用,它只是一个框架模板的通用并不是万能的 二、泛型编…

【Chapter 3】Machine Learning Classification Case_Prediction of diabetes-XGBoost

文章目录 1、XGBoost Algorithm2、Comparison of algorithm implementation between Python code and Sentosa_DSML community edition(1) Data reading and statistical analysis(2)Data preprocessing(3)Model Training and Evaluation(4)Model visualization 3、summarize 1…

Java学习——Day12

多态指的是同一个方法不同对象调用会有不同的行为,多态是方法的多态,属性没有多态,多态要有继承和重写。 这就是多态,其实原理也很简单,就是利用继承方法的重写实现的 对象的转型 向上转型:子类转成父类&…

AI生成字幕模型whisper介绍与使用

文章目录 前言一、whisper介绍二、预训练模型下载与环境配置三、推理 前言 随着人工智能技术的飞速发展,AI生成字幕模型已成为视频内容创作和传播领域的重要工具。其中,OpenAI推出的Whisper模型以其卓越的性能和广泛的应用场景,受到了广大用…

计算机毕业设计 | SpringBoot社区物业管理系统 小区管理(附源码)

1, 概述 1.1 课题背景 近几年来,随着物业相关的各种信息越来越多,比如报修维修、缴费、车位、访客等信息,对物业管理方面的需求越来越高,我们在工作中越来越多方面需要利用网页端管理系统来进行管理,我们…

4G与lora DTU农业监测应用数字化管理升级

农业监测的数字化管理升级,通过采用4G和LoRa等无线技术,解决渔业养殖、畜牧管理、农业灌溉以及远程监测等领域的互联互通。 渔业养殖水质监测 在渔业养殖中4G DTU通过采集各种水质传感器进行水质监测,4G DTU能够实时监测养殖水体的温度、pH值…

GA/T1400视图库平台EasyCVR视频融合平台HLS视频协议是什么?

在数字化时代,视频监控系统已成为保障安全、提升效率的关键技术。EasyCVR视频融合云平台,作为TSINGSEE青犀视频在“云边端”架构体系中的重要一环,专为大中型项目设计,提供了一个跨区域、网络化的视频监控综合管理系统平台。它不仅…

maven工程修改jdk编译版本的几种方法

一.背景 maven工程修改jdk编译版本的几种方法,以前这些小细节处理了就处理了,没有去记录,现在带徒弟,就写下吧!可能不全面,不喜勿喷。哦,说下,本文的例子是在eclipse中开发截图的。 …

详细介绍Transformer!

🤗Transformer是一种神经网络架构,核心思想是利用自注意力机制来捕捉序列中元素之间的关系。从而避免了传统RNN难以处理长序列依赖的问题。 Transformer的主要组件和流程 💫Encoder-Decoder结构 Transformer包含编码器和解码器两个主要部分…

中国车牌分类

从颜色和单双层分类(不考虑临时车牌) 黄单黄双黄绿单蓝单蓝双绿单绿双黑单黑双白单白双 #特殊文字 挂使港澳学警领临

【4060显卡也能跑高质量的Flux模型了吗】MIT Han 实验室开源了一个Flux的量化项目——SVDQuant

麻省理工学院(MIT)Han 实验室一直在积极开展一系列项目,包括微小机器学习(Tiny Machine Learning)、SANA、SVDQuant 和 QServe,这些项目旨在提高人工智能计算的效率,并实现在边缘设备上的高效部…

基于Java Springboot学生管理系统

一、作品包含 源码数据库全套环境和工具资源部署教程 二、项目技术 前端技术:Html、Css、Js、Vue 数据库:MySQL 后端技术:Java、Spring Boot、MyBatis 三、运行环境 开发工具:IDEA 数据库:MySQL5.7 数据库管理…

DELL Precision 系列默认用的都是非ECC内存

文章目录 DELL Precision 系列默认用的都是非ECC内存概述SSD升级SSD1SSD2 笔记DELL Precision 系列默认用的都是非ECC内存可以选非ECC的内存 备注备注如果不差钱备注END DELL Precision 系列默认用的都是非ECC内存 概述 去了一次DELL维修中心,清了一次灰。人工真贵…