JAVA多线程进阶篇 7、JUC同步器之Semaphore

Java - CountDownLatch、CyclicBarrier、Semaphore 三大JUC同步器实战对比 Semaphore是 JUC 包下最核心的三大线程同步工具,它们的设计初衷、底层实现、适用场景完全不同,没有绝对的优劣之分,只有场景适配与否的区别。本文从底层原理、实战代码、场景适配、性能对比、调优指南:基于减法计数器的一次性同步工具,适用于一个线程等待其他线程完成任务的场景,如并行接口调用、批量数据处理、服务初始化等待;实现简单,性能较高,但无法循环使用。:基于 ReentrantLock+Condition 的可循环屏障式同步工具,适用于多线程分段执行、并行计算结果合并、模拟高并发压测的场景; 阅读详情


JUC 即 java.util.concurrent 包,提供了大量的工具类来简化并发编程。

Semaphore 信号量,通过设置信号量资源的数量对并发线程进行协调。

Semaphore 设置的资源数是指能够被抢占的互斥资源数量。从而限制了同时执行的线程数量。因此,Semaphore 能够用于限流和线程协调。

1. 当资源数设置为1时,类似于一把锁。

public class SemaphoreTest {

    public static void main(String[] args) {
        Semaphore semaphore = new Semaphore(1);
        Thread t1 = new Thread(() -> {
            try {
                System.out.println("t1 semaphore requiring");
                semaphore.acquire();
                System.out.println("t1 semaphore require ok ,时间为" + LocalTime.now());
                Thread.sleep(10000);
                semaphore.release();
            } catch (InterruptedException e) {

            }
        });

        Thread t2 = new Thread(() -> {
            try {
                System.out.println("t2 semaphore requiring");
                semaphore.acquire();
                System.out.println("t2 semaphore require ok,终于获取资源:" + LocalTime.now());
                Thread.sleep(1000);
                semaphore.release();
            } catch (InterruptedException e) {

            }
        });
        t1.start();
        t2.start();
    }
}

运行结果:

Semaphore

2. 当资源数设置为多个时,起到限流作用。

public class SemaphoreTest2 {

    public static void main(String[] args) {
        Semaphore semaphore = new Semaphore(10, true);
        for (int i = 0; i < 100; i++) {
            new Thread(() -> {
                try {
                    Thread.sleep(1000);
                    semaphore.acquire(1);
                    System.out.println(Thread.currentThread().getName() + " " + new Date() + " go ,排队的有" + semaphore.getQueueLength());
                    Thread.sleep(1000);
                    semaphore.release(1);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }, "t" + i).start();
        }
    }
}

运行结果:

Semaphore2

3. 用Semaphore 写一段程序实现死锁

public class DeadLockTest {

    public static void main(String[] args) {
        Semaphore semaphore1 = new Semaphore(1);
        Semaphore semaphore2 = new Semaphore(1);

        Thread t1 = new Thread(() -> {
            try {
                System.out.println("t1 semaphore requiring");
                semaphore1.acquire();
                Thread.sleep(1000);
                semaphore2.acquire();
                semaphore2.release();
                semaphore1.release();
            } catch (InterruptedException e) {

            }
        });

        Thread t2 = new Thread(() -> {
            try {
                System.out.println("t2 semaphore requiring");
                semaphore2.acquire();
                Thread.sleep(1000);
                semaphore1.acquire();
                semaphore1.release();
                semaphore2.release();
            } catch (InterruptedException e) {

            }
        });
        t1.start();
        t2.start();
    }
}

运行结果:

deadlock

总结

Semaphore 在本科计算机操作系统里就曾提及,通过信号灯的占有与请求,保证了线程的同步与限流。同时,Semaphore 可以很好的演示死锁情况。

多线程系列在github上有一个开源项目,主要是本系列博客的实验代码。

https://github.com/forestnlp/concurrentlab

如果您对软件开发、机器学习、深度学习有兴趣请关注本博客,将持续推出Java、软件架构、深度学习相关专栏。

您的支持是对我最大的鼓励。

多线程安全——JUC工具汇总 LongAdder JDK1.8时,java.util.concurrent.atomic包中提供了一个新的原子类:LongAdder。 根据Oracle官方文档的介绍,LongAdder在高并发的场景下会比它的前辈————AtomicLong 具有更好的性能,代价是消耗更多的内存空间: 转存失败重新上传取消 ... 阅读详情

相关推荐

Java高并发开发核心:JUC工具包深度解析与实战指南

并发编程是构建高性能、高可用Java应用的核心技术之一,其核心在于通过多线程机制充分利用多核CPU资源,提升系统吞吐量。其实现原理主要围绕线程安全、锁机制和线程协作展开,通过同步控制确保共享数据的一致性。在技术价值层面,良好的并发设计能显著提升系统响应速度和资源利用率,是应对高并发场景的关键。常见的应用场景包括缓存系统、订单处理、批量任务执行和连接池管理等。本文聚焦于Java并发编程的基石——JUC(java.util.concurrent)工具包,深入剖析其核心组件如ReentrantLock、Concu

weixin_30693683的博客 389

Java并发基础:Semaphore全面解析!

Semaphore通过控制许可数量,实现了对并发线程数的精细管理,有效避免了资源竞争和过载问题,能显著提升系统吞吐量和响应速度,同时,Semaphore还支持公平与非公平策略,具有更好的灵活性和适应性,满足了不同业务场景的需求。

科技互联网领域深度探索者,乐于分享与写作。 3462

【Java多线程】JUC之深入队列同步器(AQS)(一)实现细节解析

**AbstractQueuedSynchronizer`抽象队列同步器,简称AQS`,位于` java.util.concurrent.locks 包`下,是用来构建锁或者其他同步组件的`单机多线程基础框架`** - AQS使用`模版模式`,他内置了` 获取锁、释放锁`的方法,**子类继承AQS后无需关心锁获取失败或成功之后的操作,子类应该定义一个`非公开的内部类继承AQS`,`重写锁获取或释放的条件判断的抽象方法`即可使用**; - 内部维护一个`成员变量volatile int state(共

墩墩分墩 1178

Java并发包(JUC)中的信号量Semaphore详解,深入浅出Semaphore

🍋🔥 🍑🚀支持博主:点赞👍、收藏⭐、留言💬 🐾 目录1.🍅Semaphore简介1.1🍑Semaphore是什么1.2🍑Semaphore的作用2.🍅Semaphore中的方法(我们在之后的章节中会详细讲解,读者可以先大致看一下)3.🍅acquire()方法和release()方法3.1🍑构造方法、acquire()方法和release()方法简介3.2🍑Semaphore构造器中控制线程并发量为一(某段时间内只能并发一个线程)3.3🍑Semaphore构造器中控制线程并发量为二(只能并发两个线程,即两个线

MrYushiwen的博客 2684

JUC 全家桶系列,一键三连就完事了

JUC、AQS、CAS、Lock、ReentrantLock、Atomic、Future、Executors、JUC工具类、JUC集合类、Fork-Join框架

扛麻袋的少年的博客 3296

西门子S7-1200模拟量的使用

模块类型核心参数输入信号处理输出信号配置转换原理数值范围TIA Portal配置编程要点 转换公式: 输出模拟量: 五、校准与线性化 硬件校准非线性补偿抗干扰措施数字滤波温度控制压力监控流量调节信号异常精度不足实践操作参考文档项目案例借鉴博客

weixin_51020122的博客 4771

深入解析Java并发包(JUC)中的Semaphore

Semaphore,即信号量,是操作系统中的一个经典概念。在Java并发包(java.util.concurrent,简称JUC)中,Semaphore类实现了这一概念,用于控制同时访问特定资源的线程数量。与关键字和类不同,Semaphore可以实现更为复杂的线程同步需求,允许一定数量的线程同时访问共享资源。

码到三十五 1万+

Vivado 2023.1及更早版本永久License全功能解锁:HLS、System Generator等IP核使用详解

本文深入解析Vivado 2023.1及更早版本的全功能许可证,详细指导如何解锁HLS、System Generator等高级IP核。通过许可证类型对比、功能验证方法和实战应用指南,帮助FPGA开发者充分利用Vivado工具套件,提升复杂系统设计和算法加速的效率。

weixin_31286719的博客 379

Java多线程同步工具类:Semaphore原理剖析

Java多线程同步工具类:Semaphore原理剖析

大数据开发、JAVA开发、人工智能AI 902

基于DPLL算法解决3-SAT问题(C++实现)

近日看到一个3-SAT问题(Boolean SATisfiability Problem, 布尔逻辑可满足性问题),试着写了个算法求解。

qq_63241496的博客 2215

【电力系统】高压直流输电VSC-HVDC,四个变流站联合输电 / 交直流混合并网系统

本文研究了一种基于电压源型换流器(VSC)的高压直流输电(HVDC)系统,该系统通过四个变流站实现联合输电并接入交直流混合电网。文章介绍了系统的结构、工作原理以及控制策略,分析了交直流混合并网的特性,并通过仿真验证了系统的性能。结果表明,该系统具有良好的稳定性和灵活性,能够有效实现多点供电和功率协调。

2401_84610415的博客 2239

一文彻底弄懂JUC工具包的Semaphore

Semaphore是 Java 并发包 () 中的重要工具,主要用于控制多线程对共享资源的并发访问量。它可以设置“许可证”(permit)的数量,并允许指定数量的线程同时访问某一资源,适合限流、资源池等场景。下面从源码设计、底层原理、应用场景、以及与其它 JUC 工具的对比来详细剖析 Semaphore。

lgx211 1038

优快云专栏限时活动!福利公告必读!

本人优快云付费专栏周排名27名专业博主,每周文章平均阅读量约7w以上!

FJN110的博客 3154

Java[7]:JUC工具

1.Unsafe基础工具(1) CAS自旋  CAS即比较并交换(Compare And Swap),是一种用于实现多线程同步的原子操作,通过硬件指令直接支持,能够在不使用锁的情况下确保线程安全。自旋即不断尝试CAS指令直至成功。在Java中,CAS自旋通过Unsafe类来支持。 (2) LockSupport  LockSupport是用于实现线程的阻塞和唤醒操作的工具类,它提供了一种更底层、更灵活的线程控制机制,常用于实现锁、同步器以及其他并发工具,核心功能是通过park()和 unpark()来阻塞和

正直朱的博客 774

DeepSeek 赋能招投标全流程智能化:多模态解析、知识图谱与投标文件自动生成实战指南(附完整代码与行业案例)

摘要:本文深入探讨DeepSeek技术在招投标领域的全流程智能化应用,通过整合自然语言处理(NLP)、多模态解析、知识图谱等核心技术,实现招标文件智能解析与投标文件自动生成。文中详细解析DeepSeek-R1模型的多模态处理机制、动态知识图谱构建方法及智能模板填充算法,通过完整代码实现展示技术细节。结合广某资源交易平台、山西XX"XX云"等典型案例,验证技术方案在提升招投标效率、降低人为错误方面的显著效果。

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 1463

模型实战(31)之 yolo26 实现对手部关键点数据集 的训练与关键点检测

模型实战(31)之 yolo26 实现对手部关键点数据集 的训练与关键点检测

yohnyang的博客 209

Java多线程(7):JUC(上)

前面把线程相关的生命周期、关键字、线程池(ThreadPool)、ThreadLocal、CAS、锁和AQS都讲完了,现在就剩下怎么来用多线程了。而要想用好多线程,其实是可以取一些巧的,比如JUC(好多面试官喜欢问的JUC,就是现在要讲的JUC)。

分享专业、有用、有趣的技术、产品、运营和管理知识。 229

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Java JUC并发编程全面解析:从原理到实战

Java并发编程进阶:JUC核心组件与AQS原理 摘要:本文系统讲解Java并发工具包(JUC)的核心知识体系,包含五大组件:锁框架(locks)、原子类(atomic)、并发工具(tools)、并发集合(collections)和线程池(executor)。重点剖析ReentrantLock的可重入、公平/非公平特性及读写锁实现原理,深入解析AQS同步器底层机制。通过对比synchronized与JUC锁的差异,帮助开发者根据场景选择合适并发工具,提升高并发系统性能。课程采用"理论+实践&quo

百锦再的博客 1167

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Java并发工具类全面盘点:从同步器到并发容器实战指南

(简称JUC)是Java提供的并发编程工具包,从JDK 1.5开始引入,参考自EDU.oswego.cs.dl.util.concurrent,是JSR 166标准规范的具体实现。JUC包为开发者提供了丰富的并发编程原语和高级抽象,极大地简化了多线程程序的开发难度。

✨ 欢迎来到【Seal ^_^ 的优快云博客】!✨ 165

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

JUC(7)JUC

全称是,是阻塞式锁和相关的同步器工具的框架SemaphoreFutureTask用state属性来表示资源的状态(分独占模式和共享模式),子类需要定义如何维护这个状态,控制如何获取锁和释放锁getState -获取state状态setState -设置state状态机制设置state状态独占模式是只有一个线程能够访问资源,而共享模式可以允许多个线程访问资源提供了基于FIFO的等待队列,类似于Monitor的EntryList。

2301_81354580的博客 1303

18个JUC常见面试题

ThreadLocal 是一种线程本地变量,可以允许多个线程并发访问同一个变量,但它是基于线程的隔离机制实现的,可以保证变量对每个线程都是独立的。但它只能实现独占锁,不能实现读写分离。Phaser(阶段器)是一种新的线程同步工具,主要用于分阶段的任务,它可以灵活的控制阶段的完成次数,当所有关联的线程都完成当前阶段时,才可以进入下一阶段,可以。CAS 的实现原理是,先读取变量的内存地址中的值,和期望的值进行比较,如果相同,则将新值写入这个内存地址,如果不同,则重试整个操作,直到交换成功为止。

2301_77181435的博客 4017

深入Java多线程之JUC底层--AbstractQueuedSynchronizer

文章结构: 1)AbstractQueuedSynchronizer介绍: 2)继承树分析 3)形象说明其原理 4)源码阅读分析 5)思考几个问题 一、AbstractQueuedSynchronizer介绍: AbstractQueuedSynchronizer(AQS)抽象类提供一个实现阻塞锁和依赖于FIFO等待队列的同步器的框架。 AQS被设计用来作为众多同步器的基类,例如Reentrant...

Jack__Frost的博客 1772

JUC锁——框架

锁的分类 根据锁添加到Java中的时间,将Java中的锁分为&amp;amp;quot;同步锁&amp;amp;quot;和&amp;amp;quot;JUC包中的锁&amp;amp;quot; 同步锁 即通过synchronized关键字来进行同步,实现对竞争资源的互斥访问的锁,Java 1.0版本中就已经支持同步锁了。**同步锁的原理是,对于每一个对象,有且仅有一个同步锁;不同的线程能共同访问该同步锁。但是,在同一个时间点,该同步锁能且只能被一个线程获取到。**这样

如不來的博客 283

JUC 高频面试题

JUC(java.util.concurrent)是Java并发编程的核心工具包,提供锁、原子类、线程池等模块解决传统同步的性能和功能不足问题。文章涵盖并发基础(进程/线程区别、线程生命周期)、线程安全三大根源(共享数据、CPU切换、指令重排)、volatile的内存可见性和有序性原理,以及happens-before规则等核心概念。重点包括JUC组件分类、并发与并行区别、线程创建方式及适用场景,为Java并发面试提供系统性知识框架。

SharkTen的博客 588

【JUC并发】3. AQS不为认知的秘密!

AQS(AbstractQueuedSynchronizer)是JUC并发包中的一个核心类,它提供了一种实现同步器的框架,如Semaphore等都是基于AQS实现的。AQS的核心思想是维护一个双向链表,其中链表的每个节点都表示一个线程,线程通过竞争锁来加入到链表中,当锁被释放时,链表中的下一个线程可以获取到锁。同时,AQS还提供了Condition接口,用于实现等待/通知机制。AQS是JUC并发包中的一个核心类,它提供了一种实现同步器的框架,如Semaphore等都是基于AQS实现的。

weixin_40648256的博客 275
上一篇: JAVA多线程进阶篇 3、JUC读写锁之ReadWriteLock
下一篇: JAVA多线程进阶篇 4、JUC工具类之CyclicBarrier
悟空学编程
博客等级 码龄12年 32粉丝 123原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

悟空学编程

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值