AbstractQueuedSynchronizer在工具类ReentrantLock、Semaphore、CountDownLatch、CyclicBarrier中的应用

Zemax实战:20×超高清变焦镜头设计全流程解析(从架构到制造) 本文详细解析了使用Zemax软件设计一款20倍变焦比、恒定F2.8光圈8K超高清镜头的全流程。从应对恒定光圈、宽光谱与8K解析力三大挑战的初始架构规划,到构建多重组态模型、分七阶段进行像差优化与公差分析,最终跨越制造鸿沟,为广播级影视与高精度工业检测应用提供了实战指南。 阅读详情

在java.util.concurrent包中,AbstractQueuedSynchronizer的应用非常广泛,而不局限于在ReentrantLock中的实现,本文简要介绍下AbstractQueuedSynchronizer在Semaphore、CountDownLatch、ReentrantReadWriteLock等类中的应用。

0. 回顾

上文在介绍AQS的时候,介绍了AQS和ReentrantLock类中的Sync子类互相配合完成可重入锁的实现,在这其中AQS所提供的是一套灵活和完整的队列处理机制。由于在AQS中已经提供了完整的队列处理机制,通常是不需要扩展的子类Override的。同时,AQS又提供了state属性和tryAcquire()/tryRelease()等方法,而这些正是需要子类根据具体的需求逻辑灵活实现的扩展点。从ReentrantLock、ReentrantReadWriteLock、Semaphore和CountDownLatch的实现来看,通常是在这些工具类的中封装实现自己独有的Sync内部类,而Sync就是对AQS的扩展实现。

1. Semaphore

学习操作系统理论课的时候,教材上应该都会讲过信号量这种概念,java.util.concurrent.Semaphore类就是Java中这个概念的实现。比如资源R有5个实体,如果每个线程执行的过程中需要用到1个,那么允许5个线程并发执行,第6个会等待其他线程释放资源后继续执行。

先看一个应用Semaphore的例子:
其中最主要的方法就是acquire()和release(),更详细的可以参看Oracle的API文档。

ExecutorService exec = Executors.newCachedThreadPool();
        finalSemaphore sem = newSemaphore(5);
 
        for(inti = 1; i < 100; i++) {
            finalint tid = i;
            Runnable semTask = newRunnable() {
                publicvoid run() {
                    try{
                        sem.acquire();
 
                        System.out.println("running thread with id: " + tid);
                        Thread.sleep((long) (Math.random() * 3000));
                        System.out.println("completing with id: " + tid);
 
                        sem.release();
                    }catch(InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            };
            exec.execute(semTask);
        }
        exec.shutdown();

下面看看Semaphore的实现。如果熟悉ReentrantLock的实现,那么Semaphore其实很好理解,简单来讲,Semaphore实际上就是把锁的限制从1变为N。

  • state存储的是表示剩余可用资源的值
  • Node采用的是SHARED模式
  • 获得锁之后会尝试传播,释放更多锁

2. CountDownLatch

这个类主要是为了解决多线程中的状态依赖问题。java.util.concurrent.CountDownLatch这个类从名字就可以看出,是以一个递减计数器为基础,多个线程共享这样一个对象,开启一个计数值,某些线程可以等待这个计数器值为0的时候继续任务,调用await(),而那些改变状态的线程需要做的就是使计数器递减,调用countDown()方法。

ExecutorService exec = Executors.newCachedThreadPool();
        finalCountDownLatch cdl = newCountDownLatch(3);
 
        Runnable watingTasks = newRunnable() {
            publicvoidrun() {
                try{
                    System.out.println("there're 3 tasks here. if all tasks are finished, i will go home.");
                    System.out.println("working...");
 
                    cdl.await();
 
                    System.out.println("ok, i will go home now!");
                }catch(InterruptedException e) {
                    e.printStackTrace();
                }
            }
        };
        exec.execute(watingTasks);
 
        for(inti = 0; i < 3; i++) {
            finalinttid = i;
            Runnable semTask = newRunnable() {
                publicvoidrun() {
                    try{
                        System.out.println("starting task " + tid +  "...");
                        Thread.sleep((long) (Math.random() * 5000));
                        System.out.println("task " + tid +  " finished");
 
                        cdl.countDown();
 
                    }catch(InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            };
            exec.execute(semTask);
        }
        exec.shutdown();

和Semaphore类似,在使用AQS的实现上,主要有以下几点。

  • state存储的是count计数变量
  • Node采用的是SHARED模式
  • countDown()调用tryReleaseShared使得计数减1
  • await是调用tryAcquire,实际上就是判断state是否为0

3. ReentrantReadWriteLock

在高并发场景下,为了让任务执行更有效率,将读和写场景分离是有必要的。这是因为读和写在线程安全方面特点的不同,读不改变状态,多个线程是可以同时进行而没有问题的,而写与写、写与读之间都是需要互斥的。在java.util.concurrent中,ReentrantReadWriteLock这个类就是做这个事情的。

具体的使用就不举例了,直接分析下其实现。从类名上看ReentrantLock和ReentrantReadWriteLock就很相似,实现上也有相似的部分。ReentrantReadWriteLock中封装了ReadLock和WriteLock内部类,而ReentrantReadWriteLock、ReentrantReadWriteLock.ReadLock、ReentrantReadWriteLock.WriteLock中都有自己的Sync类属性,使用的是ReentrantReadWriteLock.Sync实现,而且对象关系上,ReadLock和WriteLock中的sync都是指向ReentrantReadWriteLock对象中的sync引用,即使用了同一个AQS同一套队列,只是将方法分离开来处理。

其中的要点:

  • state同时存储r和w的个数
  • WriteLock的锁操作类似ReentrantLock使用互斥节点
  • 而readlock使用共享节点
  • 读锁写锁的逻辑在各自的tryLock中,最终实现在ReadWriteLock的tryReadLock和tryWriteLock中

4. CyclicBarrier

在这里说java.util.concurrent.CyclicBarrier,并非因为其使用了AQS,而是因为它的用法和CountDownLatch有类似之处。CyclicBarrier和CountDownLatch都是处理状态依赖的问题的,而不同之处是使用CyclicBarrier的线程互相依赖,即互相等待,直到达到某一特定状态,这些线程同时继续执行。

CyclicBarrier是基于ReetrantLock和ConditionObject的,await()的时候对计数器递减,并检查是否为0,如果为0则执行CyclicBarrier类对象的barrierCommand(Runnable类对象属性)并signalAll()通知所有等待线程开始下一轮,否则阻塞当前线程。

机器视觉应用工程师职位深度解析与面试指南 广东奥普特科技招聘机器视觉应用工程师,要求大专以上理工科专业背景,熟悉C/C++或PLC编程,具备自动化设备调试经验。岗位职责包括视觉项目方案评估、系统安装调试、售后技术支持及异常处理,需接受外派出差。该职位面向专业对口的应届生或实习生,强调动手能力、沟通技巧和吃苦耐劳精神。机器视觉工程师需掌握图像处理算法、硬件配置等核心技术,在工业自动化领域具有良好发展前景。求职者应注重编程能力和实践经验的积累,以胜任这一技术密集型岗位。 阅读详情

相关推荐

VCSA的vmware-updatemgr服务无法启动和vSAN界面报“certificate chain is not trusted and thumbprint doesn‘t match”处理

"Unable to update CM service info"和"Server certificate chain is not trusted and thumbprint doesn't match"问题处理

jetliu05的博客 1883

JAVA多线程并发(六)-- ReentrantLock、Semaphore、CountDownLatch 简介

ReentrantLock支持公平锁和非公平锁。公平锁会按照线程请求锁的顺序来分配锁,而非公平锁则可能允许刚刚释放锁的线程再次获得锁。默认情况下,ReentrantLock创建的是非公平锁。加锁过程涉及到线程的等待队列和状态变更,而非公平锁和公平锁在加锁时的主要区别在于线程获取锁的顺序。解锁过程则相对简单,主要是将当前线程从锁的持有者中移除,并唤醒等待队列中的其他线程。在Spring应用中,我们可以使用ReentrantLock来实现对共享资源的线程安全访问。

dazhong2012的专栏 1084

告别环境配置焦虑:在Win10的Ubuntu子系统里搞定CSAPP实验环境(附32/64位库编译指南)

本文详细介绍了如何在Win10的Ubuntu子系统中搭建CSAPP实验环境,包括WSL 2的安装与配置、32/64位库的编译指南以及高效开发工具链的设置。通过优化WSL性能和使用实用技巧,开发者可以轻松应对CSAPP实验中的环境配置问题,提升学习效率。

weixin_30443813的博客 296

java多线程并发基础(三,ReentrantLock,CountDownLatch,CyclicBarrier,Semaphore实现原理)

一、独占锁ReentrantLock的原理 ReentrantLock是可重入的独占锁,同时只能有一个线程可以获取该锁,其他获取该锁的线程会被阻塞放入该锁的AQS阻塞队列里面。 从图中可以看出,ReentrantLock最终还是使用AQS来实现的,并且根据参数来决定其内部是一个公平锁还是非公平锁 public ReentrantLock() { //默认非公平锁 ...

Suarge的博客 1011

提升AI智能体回复质量:扣子平台提示词优化技巧与案例解析

本文深入探讨了在扣子平台上优化AI智能体提示词的关键技巧与实战案例。通过分析提示词设计的核心原则、业务场景适配策略以及平台高级功能应用,帮助开发者显著提升AI Agent的回复质量。文章特别强调了结构化提示词设计和A/B测试评估的重要性,并提供了电商客服场景的完整优化案例。

weixin_30897233的博客 538

LSTM 怎么进行二维数据的输入呢

尽管LSTM并不天然地适用于处理图像、视频等二维数据,但通过时间序列化、卷积特征提取和双向LSTM等方法,我们可以将二维数据转化为适合LSTM输入的形式,从而利用LSTM的强大记忆能力和长期依赖学习能力对二维数据进行建模。未来的研究方向可以考虑将LSTM与其他模型结合,例如将LSTM与卷积神经网络(Convolutional Neural Network, CNN)结合,利用CNN提取图像的空间特征,然后利用LSTM学习时间序列的长期依赖;

xiamu_CDA的博客 1037

CountDownLatch详解

【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> ...

爱宝贝丶的博客 257

Windows Server远程桌面断开后,PyWinAuto/按键精灵脚本失效?试试这个‘会话保持’的终极配置

本文深入解析Windows Server远程桌面断开后导致PyWinAuto/按键精灵脚本失效的问题,提供会话保持的终极配置方案。通过转换到控制台会话(console模式)和调整组策略,确保自动化程序在断开连接后持续稳定运行,适用于Windows Server各版本。

weixin_28738165的博客 227

JUC 常用并发工具类教程(包括可重入锁ReentrantLock、CountDownLatch、读写锁ReadWriteLock、信号量Semaphore、常见队列等)

juc 多线程 重入锁ReentrantLock、CountDownLatch、读写锁ReadWriteLock、信号量Semaphore、常见队列

tttalk的博客 1281

课程1:认识Asp.net Core Web API

本文是《.Net Core从零学习搭建权限管理系统》教程专栏的导航站(点击链接,跳转到专栏主页,欢迎订阅,持续更新…)专栏介绍:以实战为线索,基于.Net 7 + REST + Vue、前后端分离,不依赖任何第三方框架,从零一步一步讲解权限管理系统搭建。专栏适用于人群:Web后端开发人员Web API是一个很广泛的概念,Asp.net Core Web API是.NET框架用于创建RESTful风格的项目、用于轻松构建可供多个客户端访问的HTTP服务。1、支持RestFul风格编程;

成长的足迹 1256

基于 Arduino 的鱼缸水质检测控制系统设计

本系统通过多传感器实时采集鱼缸水质参数(pH 值、温度、溶解氧、浊度),经 Arduino 主控芯片处理后,驱动执行模块自动调节水质,并通过显示模块实时展示数据。系统具备阈值报警、自动换水、温度调节、增氧等功能,适用于家庭或小型水族箱的水质智能管理。本设计提供了低成本、易扩展的鱼缸水质管理方案,适用于家庭水族箱或小型水产养殖场景,可根据实际需求调整传感器类型和控制逻辑。注:本设计如有疑问需要解惑可直接私信本人,看我个人简介。

weixin_42300449的博客 1086

java实现管程之AQS以及ReentrantLock、Semaphore、CountDownLatch、CyclicBarrier

管程 管程是管理共享变量和对共享变量操作的过程;上文讲解了synchronized在jvm层面实现了MESA管程模型,本文阐述AQS在java层面实现MESA管程模型 AQS--AbstractQueuedSynchronizer AQS是java层面实现管程的同步队列抽象类,抽象类实现管程的同步等待队列和条件等待队列;而加锁和解锁的逻辑由具体的子类实现,只是对外提供模板方法,由程序员自己实现加解锁的逻辑。 AQS特性 阻塞等待队列;共享/独占;公平/非公平;可重入;可中断...

weixin_36279234的博客 900

0 基础学前端:100 天拿 offer 实战课(第 16 天)—— JS 数组高级方法:数据处理效率翻倍,代码更简洁

方法名核心作用回调函数返回值返回结果适用场景map数据转换转换后的新元素新数组(长度与原数组一致)格式转换、新增字段、生成 DOM 字符串filter数据筛选true(保留)/false(过滤)新数组(符合条件的元素)筛选符合条件的元素(如未完成计划、今天的评论)reduce数据汇总新的累加值任意类型(数字、对象等)求和、计数、分组、多数据汇总find查找元素true(匹配)/false(不匹配)第一个匹配的元素 /undefined。

苏打水.X的博客 133

赛普拉斯汽车电子嵌入式方案:车规MCU选型、功能安全与量产测试实战

在汽车电子领域,车规级MCU远不止是“能跑代码”的芯片,它需要扛住AEC-Q100宽温、ISO 26262功能安全、CAN/CAN FD总线通信及长期供货等多重严苛要求。硬件架构上,从电源域设计、时钟复位到EMC防护,每个细节都直接影响系统可靠性;软件层面,安全机制落地、MISRA C规范与故障注入测试则是通过认证的关键。面对车身控制、仪表盘或域控制器等不同场景,工程师需在MCU选型、存储搭配与无线连接方案上统筹考量。本文基于赛普拉斯Traveo II、PSoC及车规NOR Flash等核心产品,梳理了一套

weixin_34014555的博客 384

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

AQS、Semaphore、CountDownLatch与CyclicBarrier原理及使用方法

AQS AQS 的全称为AbstractQueuedSynchronizer,翻译过来的意思就是抽象队列同步器。这个类在java.util.concurrent.locks包下面,AQS 就是一个抽象类,继承了AbstractOwnableSynchronizer ,主要用来构建锁和同步器,方法定义如下: public abstract class AbstractQueuedSynchronizer extends AbstractOwnableSynchronizer implements...

如何心安理得的在老板眼皮下摸鱼 1274

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

快速了解基于AQS实现的Java并发工具类

AQS是AbstractQueuedSynchronizer的简称,类如其名,抽象的队列式的同步器,它是一个Java提高的底层同步工具类,用一个int类型的变量表示同步状态,并提供了一系列的CAS操作来管理这个同步状态,许多同步类实现都依赖于它,如常用的CountDownLatch、Semaphore、CyclicBarrier、ReentrantLock和StampedLock,后文会逐个...

全菜工程师小辉的博客 8713

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

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

java 里面c = getstate()_Java多线程-AQS、Semaphore、CountDownLatch、CyclicBarrier

1 AQS 简单介绍AQS 的全称为(AbstractQueuedSynchronizer),这个类在 java.util.concurrent.locks 包下面。AQS 是一个用来构建锁和同步器的框架,使用 AQS 能简单且高效地构造出应用广泛的大量的同步器,比如我们提到的 ReentrantLock,Semaphore,其他的诸如 ReentrantReadWriteLock,Synchro...

weixin_39818264的博客 86

从 ReentrantLock 看AQS

从 ReentLock 看 AQS

qq_39190155的博客 264

同步器的基础之队列同步器AQS

1 AQS 简单介绍 AQS的全称为(AbstractQueuedSynchronizer),这个类在java.util.concurrent.locks包下面。 AQS是一个用来构建锁和同步器的框架,使用AQS能简单且高效地构造出应用广泛的大量的同步器,比如我们提到的ReentrantLock,Semaphore,其他的诸如ReentrantReadWriteLock,SynchronousQueue,FutureTask等等皆是基于AQS的。当然,我们自己也能利用AQS非常轻松容易地构造出符合我们自己

阳阳的博客 360

多线程--AQS

多线程--AQS一、AQS详解二、源码阅读 一、AQS详解 什么是AQS AQS:AbstractQuenedSynchronizer抽象的队列式同步器。是除了java自带的synchronized关键字之外的锁机制。AQS的全称为(AbstractQueuedSynchronizer),这个类在java.util.concurrent.locks包 AQS的核心思想是,如果被请求的共享资源...

qq_45489824的博客 508

currentPackage(CAS、AQS、CLH、LOCK、ReentrantLock、CountDownLatch等)

currentPackage 目录currentPackageCAS(Compare and Swap)CAS是什么?CAS原理?有什么特性?AbstractQueuedSynchronizer(AQS)AQS是什么?AQS核心思想?AQS原理?CLH(Craig,Landin,and Hagersten)队列是?AQS实现?独占与共享?LockReentrantLock:基于AQS的一个同步组件可重入状态如何记录?CountDownLatchCompletableFutureCyclicBarrierSe

GZHarryAnonymous的博客 725

08:java基础-锁之AQS&ReentrantLock&BlockingQueue&CountDownLatch&Semapho

Exclusive-独占,只有一个线程能执行,如ReentrantLockShare-共享,多个线程可以同时执行,Semaphore/CountDownLatch同步等待队列条件等待队列不同的自定义同步器争用共享资源的方式也不同。自定义同步器在实现时只需要实现共享资源state的获取与释放方式即可,至于具体线程等待队列的维护(如获取资源失败入队/唤醒出队等),AQS已经在顶层实现好了。该线程是否正在独占资源。只有用到condition才需要去实现它独占方式。

weixin_43761434的博客 1073

Java并发三剑客:Semaphore、CountDownLatch与CyclicBarrier详解

摘要: 本文系统对比Java并发工具Semaphore、CountDownLatch、CyclicBarrier的核心原理与应用场景。三者均基于AQS实现:Semaphore通过许可证控制资源并发访问,适用于限流;CountDownLatch为一次性计数器,用于主线程等待多子任务完成;CyclicBarrier为可复用的线程同步屏障,支持多阶段任务协同。文中结合源码解析底层机制(如Semaphore的公平/非公平模式、CyclicBarrier的Generation代际管理),给出典型代码示例(如数据库连接

m0_66083353的博客 522

AQS 原理以及 AQS 同步组件总结

AQS 原理以及 AQS 同步组件总结 AQS 简单介绍 AQS的全称为(AbstractQueuedSynchronizer),这个类在java.util.concurrent.locks包下面。 AQS是一个用来构建锁和同步器的框架,使用AQS能简单且高效地构造出应用广泛的大量的同步器,比如我们提到的ReentrantLock,Semaphore,其他的诸如ReentrantReadWriteLock,SynchronousQueue,FutureTask等等皆是基于AQS的。当然,我们自己也能利用

liuwd的博客 226

java+lock+trylock_Java多线程--JUC-Lock锁(ReentrantLock、AQS)

点击上方蓝色字体,选择“标星公众号”优质文章,第一时间送达java.util.concurrent 在并发编程中使用的工具类,其重点有lock锁、辅助工具类、Atomic原子类以及并发集合框架等。lock 最 常 用 的 类 就 是 ReentrantLock , 其 底 层 实 现 使 用 的 是AbstractQueuedSynchronizer(AQS)Java是如何实现原子操作?在Java...

weixin_31934101的博客 335

基于AQS实现的Java并发工具类

AQS是AbstractQueuedSynchronizer的简称,类如其名,抽象的队列式的同步器,它是一个Java提高的底层同步工具类,用一个int类型的变量表示同步状态,并提供了一系列的CAS操作来管理这个同步状态,许多同步类实现都依赖于它,如常用的CountDownLatch、Semaphore、CyclicBarrier、ReentrantLock和StampedLock,后文会逐个介绍。 AQS维护了一个volatile int state(代表共享资源)和一个FIFO线程等待队列(多线程争用资

u013733643的博客 474
上一篇: Continuation 异步化机制
下一篇: Lock、ReentrantLock和AbstractQueuedSynchronizer的源码要点分析整理
kobejayandy
博客等级 码龄18年 2853粉丝 43原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值