Java并发篇--AQS原理

Java并发编程之AQS AQS是AbstractQueueSynchronizer是缩写,其意思就是抽象队列同步器。原理就是通过一个FIFO队列维护一个state同步状态值,只需要继承该抽象类重写对应的方法便可实现一套线程同步机制。AQS抽象类在java.util.concurrent.locks包下定义。如上图所示,AQS属于一个抽象类,主要是用来构建锁结构以及同步器的一个抽象类。AQS继承了AbstractOwnableSynchronizer,其作用为设置和获取独占锁的拥有者线程方法。 阅读详情

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();
    }
}
使用菱FX5U系列PLC实现以太网通信的具体方法示例 接下来,我们将创建一个简单的CPU通信功能,以实现与其他设备的以太网通信。在上述代码中,我们首先设置访问号,然后创建一个数据读取命令(M_READ)和一个数据写入命令(M_WRITE)。此外,在实际应用中,您还需要确保PLC和其他设备之间的网络连接正常,并且遵循相应的通信协议。在上述代码中,我们执行了数据读取命令,并将接收到的响应存储在M_RESPONSE变量中。通过简单CPU通信功能,菱FX5U系列PLC可以实现与其他设备的以太网通信。我们将提供相应的源代码和详细的说明,以帮助您轻松实现这一功能。 阅读详情

相关推荐

别再死记硬背了!用Wireshark抓包实战,5分钟搞懂GRE、L2TP、IPsec的区别

本文通过Wireshark抓包实战,详细解析GRE、L2TP和IPsec三大隧道协议的核心差异与应用场景。从报文结构到配置示例,帮助网络工程师快速掌握这些协议的本质,提升VPN部署与故障排查能力。特别适合准备HCIP认证的工程师深化理解。

weixin_30352645的博客 439

JAVA面试-并发篇 05-并发包AQS队列实现原理是什么

AQS(AbstractQueuedSynchronizer)是Java.util.concurrent包的核心基石,为ReentrantLock、CountDownLatch、Semaphore等几乎所有并发工具提供了统一的同步实现框架。其核心思想是:用一个volatile修饰的int型state变量表示同步状态,配合一个FIFO的**CLH(Craig, Landin, and Hagersten)**双向等待队列,实现线程的排队、阻塞与唤醒机制,解决了同步器实现的重复劳动问题。

fengyunhust的专栏 294

腾讯大佬总结的170道 python面试题

简述基于 TCP 协议的套接字通信流程。19.面向对象中`__new__` 和 `__init__` 区别。86. 解释 Python 中的`//`,`%`和`**`运算符。45.isinstance 的作用以及与 type()的区别。3. 简述下 Python 中的字符串、列表、元组和字典。143. 如何高效的找到 redis 中的某个 KEY。140. 如何保证 redis 中的数据都是热点数据。147. redis 中的 watch 的命令的作用。108. 简述 进程、线程、协程的区别以及应用场景。

AudiA6LV6的博客 488

【深入浅出Java并发编程指南】「原理分析篇」深入分析AQS的工作原理(前传)

本章讲解一下CAS,本质就是机器指令:cmpxchg+lock(根据处理器核数进行判断) 原子操作; 而在谈到并发操作里面,我们不得不谈到AQS,JDK的源码里面好多并发的类都是通过Sync(同步器)的内部类继承AQS而实现出五花八门的功能;

世界上并没有完美的程序,但是我们并不因此而沮丧,因为写程序就是一个不断追求完美的过程。 279

双通道中频信号数字下变频及相位差估计(FPGA)

双通道中频信号数字下变频及相位差估计实验 一、上框图(通俗易懂) 二、实验要求 1、 用点频信号模拟中频信号:中频信号由DDS1和DDS2产生。具体产生方法见第2点。 2、 DDS1和 DDS2:调用IPcore里的数字信号处理中的NCO模块,工作时钟为100MHz,数据率即为100MHz,DDS1和DDS2的频率为:(学号后三位+500)Khz+f0(可设为20MHz);输出为16位;DDS1...

qq_39809425的博客 6941

AR-HMM模型 自回归隐马尔可夫模型

AR-HMM模型 自回归隐马尔可夫模型 数据处理过程 输入的视频数据首先需要被裁剪以适合动物的大小,在这之后考虑到模型建立的目的为行为状态的分类,于是需要消除可能一帧里带有多个动作状态的行为成分,这个过程也就是对帧。对帧之后我们的为了适应模型训练还需要对每一帧的数据进行小波分解(类似傅里叶变换的信号重构),此时数据预处理阶段完成。 信号重构后的数据拥有的特征维度过多,因此需要应用主成分分析法(PCA)来选出对于分类结果贡献度最高的前十个分类特征。至此自回归隐马尔可夫模型的准备工作就完成了。 AR-HMM自

weixin_46263718的博客 2282

【深入浅出Java并发编程指南】「原理分析篇」非常全面的的探索和分析AQS的基本原理和实现机制(道法器术篇)

本章讲解一下CAS,本质就是机器指令:cmpxchg+lock(根据处理器核数进行判断) 原子操作; 而在谈到并发操作里面,我们不得不谈到AQS,JDK的源码里面好多并发的类都是通过Sync(同步器)的内部类继承AQS而实现出五花八门的功能

世界上并没有完美的程序,但是我们并不因此而沮丧,因为写程序就是一个不断追求完美的过程。 573

抖音小程序:解决获取手机号报错 getPhoneNumber:fail auth deny,登录注册时需要获取用户手机号,getPhoneNumber一直提示错误(Uniapp抖音小程序报错也能解决)

抖音字节小程序获取手机号报错getPhoneNumber:fail auth deny,抖音 小程序 获取手机号 报错 getPhoneNumber:fail auth ,抖音小程序获取手机号始终返回拒绝,抖音小程序获取手机号,已经过了试运营期但依旧报错如何解决,调用 tt.getPhoneNumber 接口报错,登录注册时需要获取用户手机号,getPhoneNumber一直提示getPhoneNumber:fail auth deny,此能力仅支持小程序通过试运营期后可用,默认获取权限,无需申请;unia

✅ 精选推荐文章 4305

Java并发面试题&知识点总结(下篇)

大家好,我是栗筝i,从 2022 年 10 月份开始,我便开始致力于对 Java 技术栈进行全面而细致的梳理。这一过程,不仅是对我个人学习历程的回顾和总结,更是希望能够为各位提供一份参考。因此得到了很多读者的正面反馈。而在 2023 年 10 月份开始,我将推出 Java 面试题/知识点系列内容,期望对大家有所助益,让我们一起提升。今天与您分享的,是 Java 并发知识面试题系列的总结篇(下篇),我诚挚地希望它能为您带来启发,并在您的职业生涯中起到助益作用。

栗筝i的博客 5960

在Qt中集成VTK和PCL:实现数据可视化的完整指南

在现代软件开发中,数据可视化至关重要。将VTK(Visualization Toolkit)和PCL(Point Cloud Library)集成到Qt环境里,能为开发者提供强大的可视化解决方案。本文将深入讲解如何在Qt中读取PCL文件,展示VTK模型和PCL数据,适合想要在Qt项目中实现数据可视化的开发者。

轩宇的博客 917

【STK】手把手教你利用STK进行弹道导弹和运载火箭发射仿真的相关方法全过程解析

写这个系列主要是这几年做了一些弹道导弹和运载火箭发射的相关仿真项目,stk软件由于其专业性在国内比较小众,相关的教程和书籍、经验贴都不是很多,因此新手在进行开发中容易遇到较多困难,把自己的一些经验体会写下来,一方面供自己总结回顾,另一方面也希望对大家有所帮助。这个系列计划分几篇文章写完,每章的内容结构相似,都分为①如何确定发射场位置和发射轨迹、②导入导弹和运载火箭模型、③设计模型分段动作、④飞行参数分析和相关应用这四个部分,每篇文章争取完整描述1-2个实际项目的操作过程。

weixin_44184852的博客 5988

java并发核心知识体系精讲_Java并发中级知识整理

接上篇Java并发基础知识整理并发锁和容器抽象同步队列AQSAQS是Java并发包的基础,提供了一个实现阻塞锁和相关同步器(信号量,事件等)的框架,依赖于先进先出(FIFO)等待队列。AQS双向等待队列和单向条件队列AQS的state变量是AQS同步的关键,由volatile修饰,保证可见性,在不同的锁和同步器的实现中,state有不同的含义。AQS的head和tail都是Node类型,也由vol...

weixin_39843078的博客 270

【华为OD机试真题 新系统】1043、魔法咒语组合 | 机试真题+思路参考+代码解析(C++、Java、Py、C语言、JS)

【华为OD机试真题 新系统】1043、魔法咒语组合 | 机试真题+思路参考+代码解析(C++、Java、Py、C语言、JS) 华为od机试,华为od机试真题,华为od机试E卷,华为odE卷,华为od机试真题E卷,华为OD,华为OD机试,华为OD机试真题,华为od机考,华为od机试D卷,华为od机试真题D卷,华为od手撕代码,华为od,华为od机试C卷,华为od e卷,华为2026e卷,od机试,2026E卷,华为OD机试E卷,什么是华为od,华为od介绍,全面了解华为od,2026华为od,如何备战华为od

KJ.JK 282

面试题-并发篇

synchronized 锁升级原理:在锁对象的对象头里面有一个 threadid 字段,在第一次访问的时候 threadid 为空,jvm 让其持有偏向锁,并将 threadid 设置为其线程 id,再次进入的时候会先判断 threadid 是否与其线程 id 一致,如果一致则可以直接使用此对象,如果不一致,则升级偏向锁为轻量级锁,通过自旋循环一定次数来获取锁,执行一定次数之后,如果还没有正常获取到要使用的对象,此时就会把锁从轻量级升级为重量级锁,此过程就构成了 synchronized 锁的升级。

m0_53910473的博客 851

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

21. Java AQS 原理

本节内容主要是对 AQS 原理的讲解,之所以需要了解 AQS 原理,是因为后续讲解的 ReentrantLock 是基于 AQS 原理的。本节内容相较于其他小节难度上会大一些,基础薄弱的学习者可以选择性学习本节内容或者跳过本节内容。了解什么是 AQS,这是认识 AQS 原理的前提,是本节的基础知识点;了解 AQS 提供的两种锁功能,对其有一个全局的了解;了解 AQS 的内部框架原理结构,这是本节课程的核心所在,其他所有的知识点讲解都是围绕这一知识点的;

这是一个web全栈开发的博客,取其精华去其糟粕,争取让大家一看就懂,一学就会,一用就成~ 1288

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Java并发-AQS及各种Lock锁的原理

什么是AQS AQS是AbustactQueuedSynchronizer的简称,它是一个Java提高的底层同步工具类,用一个int类型的变量表示同步状态,并提供了一系列的CAS操作来管理这个同步状态。AQS的主要作用是为Java中的并发同步组件提供统一的底层支持,例如ReentrantLock,CountdowLatch就是基于AQS实现的,用法是通过继承AQS实现其模版方法,然后将子类作为同...

不瘦十斤不换名字 3万+

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

AQS的核心原理分析

之前已经写过一篇关于AQS的介绍了,基本概念我就不多逼逼了,我直接把我那篇文章复制过来。后面来根据java的源码分析这个AQS的内部实现。 前言:这一部分的基础概念讲解,全部都是我之前的一篇博客:谈谈你对AQS的了解 1.写在前面: 这篇文章,我们来聊聊面试时一个比较有杀伤力的问题:聊聊你对AQS的理解? 之前有同学反馈,去互联网公司面试,面试官聊到并发时就问到了这个问题。当时那位同学内心估计受到了一万点伤害。。。因为首先,很多人可能连AQS是什么都不知道。或者仅仅是听说过AQS这个名词,但是可能连

oldshaui的博客 5250

Java并发编程——AQS原理解析

AQS原理解析,CountDownLatch, Semaphore和CyclicBarrier 详解

m0_62909831的博客 2164

Java并发之AbstractQueuedSynchronizer(AQS)详解

何为AQS?AQS 的全称为 AbstractQueuedSynchronizer,翻译抽象队列同步器。AQS定义了多线程访问共享资源同步器框架,许多同步类实现都依赖于它,这个类在 java.util.concurrent.locks 包下面。​AQS 就是一个抽象类,主要用来构建锁和同步器。 AQS 为构...............

陈橘又青的博客 2万+

JAVA并发编程AQS原理剖析

很多小朋友面试时候,都会被面试官问:说一下AQS原理。面对并发编程基础和面试经验,拉丁解牛专栏采用通俗简洁无废话无八股文方式剖析原理和源码,让天下没有难啃的技术。

拉丁解牛技术专栏 1474

Java 并发掌握AQS的原理及应用

本文深入解析了Java并发编程中的AQS(AbstractQueuedSynchronizer)框架及其应用。主要内容包括: AQS是Java同步类(Lock、Semaphore等)的基础框架,提供原子状态管理、线程阻塞/唤醒和队列模型功能 以ReentrantLock为例,对比分析其与synchronized的特性差异,展示AQS在实际锁实现中的应用 详细剖析AQS的五层架构设计,从API层到底层数据结构,重点讲解独占锁的实现机制 介绍AQS核心数据结构Node,解析CLH变体队列的节点实现和状态管理 通

26857259 937

Java 并发编程之AQS

AbstractQueuedSynchronizer (AQS) 是 Java 并发编程中的一个核心框架,广泛用于构建锁和其他同步器(如信号量、读写锁等)。它是 java.util.concurrent.locks 包的一部分。AQS 的设计目的是简化并发同步器的实现。理解 AQS 对于深入理解 Java 并发编程非常重要。

微笑听雨 6763

【并发编程】AQS原理

全称是,是阻塞式锁和相关的同步器工具的框架//同步器类@Override@Override@Override //是否持有独占锁=null){有了自定义同步器,很容易复用 AQS ,实现一个功能完备的自定义锁@Override //加锁,不成功进入等待队列等待@Override //加锁,可以被打断@Override //尝试加锁(一次)@Override //尝试加锁(带超时时间)@Override //解锁@Override //创建条件变量。

m0_62645012的博客 2068

Java并发编程,AQS详解

AQS是Java并发编程中一个不可或缺的工具,它不仅简化了锁的实现过程,还为开发者提供了一个强大的基础架构,使得我们可以轻松地创建各种类型的同步组件。理解AQS的工作原理及其相关的同步原语(如锁、条件变量等),可以帮助我们在编写复杂的并发程序时更加得心应手。需要注意的是,虽然AQS提供了许多便利的功能,但它仍然需要谨慎使用,尤其是在处理复杂的同步逻辑时。此外,随着Java版本的不断更新,越来越多的功能已经被标准化和封装到了更高级别的API中,因此我们应该优先考虑使用这些API来满足

横竖撇折点 2501

【JAVA并发】AQS原理详解

AQS详解

qq_27198345的博客 1771

Java 并发(二)—— AQS原理

不同的自定义同步器争用共享资源的方式也不同。

weixin_68074170的博客 1622
上一篇: Java并发篇--异步模式之工作线程
下一篇: Java并发篇--ReentrantLock原理
有点困的拿铁
博客等级 码龄4年 245粉丝 58原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值