JUC之各种锁的使用:CountDownLatch,CyclicBarrier,ReadWriteLock,Semaphore

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

CountDownLatch

CountDownLatch的典型使用环境是:确保某个操作在其需要的一个多线程操作完成后执行。比如说赛跑者必须等发令枪响。await是阻塞,countDown是倒计,构造函数中指定初始值。只有初始值被countDown到0时,阻塞才会被打开。

		 //所有线程阻塞,然后统一开始  
        CountDownLatch begin = new CountDownLatch(1);  
          
        //主线程阻塞,直到所有分线程执行完毕  
        CountDownLatch end = new CountDownLatch(5);  
          
        for(int i = 0; i < 5; i++){  
            Thread thread = new Thread(new Runnable() {  
                  
                @Override  
                public void run() {  
                    try {  
                        begin.await();  
                        System.out.println(Thread.currentThread().getName() + " 起跑");  
                        Thread.sleep(1000);  
                        System.out.println(Thread.currentThread().getName() + " 到达终点");  
                        end.countDown();  
                    } catch (InterruptedException e) {  
                        e.printStackTrace();  
                    }  
                      
                }  
            });  
              
            thread.start();  
        }  
          
        try {  
            System.out.println("1秒后统一开始");  
            Thread.sleep(1000);  
            begin.countDown();  //发令枪响
  
            end.await();  
            System.out.println("停止比赛");  
        } catch (InterruptedException e) {  
            e.printStackTrace();  
        }  
          
    }  

CountDownLatch可以当成一个带数量的join。允许1或者多个线程,等待另外N个线程完成某件事情之后,这1个或者多个线程才能执行。

CyclicBarrier

与CountDownLatch不同的是该barrier在释放等待线程后可以重用,所以称它为循环(Cyclic)的屏障(Barrier)。
设想这个场景,一群工人要在AB两地往返工作,负责接送他们的是一个大巴,这个大巴不等坐满就不发车。

public class JUCMain {

    public static Object object = new Object();

    public static void main(String[] args) {
        //System.out.println("begin");
        JUCMain main = new JUCMain();
        main.testCB();
        //System.out.println("end");

    }



    public static class WorkerThread implements Runnable{

        CyclicBarrier barrier;

        public WorkerThread(CyclicBarrier b){
            this.barrier = b;
        }

        @Override
        public void run() {
            int i = 10;
            // TODO Auto-generated method stub
            try{
                while (i>0){
                    System.out.println("ID:"+Thread.currentThread().getId()+" Waiting");
                    //线程在这里等待,直到所有线程都到达barrier。
                    barrier.await();
                    System.out.println("ID:"+Thread.currentThread().getId()+" Working");
                    i--;
                    barrier.await();
                }
            }catch(Exception e){
                e.printStackTrace();
            }
        }

    }


    public void testCB() {
        // TODO Auto-generated method stub
        CyclicBarrier cb = new CyclicBarrier(5, new Runnable() {
            //当所有线程到达barrier时执行
            @Override
            public void run() {
                // TODO Auto-generated method stub
                System.out.println("Inside Barrier");

            }
        });

        for(int i=0;i<5;i++){
            new Thread(new WorkerThread(cb)).start();
        }
    }

上述代码输出:
ID:10 Waiting
ID:11 Waiting
ID:12 Waiting
ID:13 Waiting
ID:14 Waiting
Inside Barrier
ID:14 Working
ID:10 Working
ID:12 Working
ID:13 Working
ID:11 Working
Inside Barrier

ReadWriteLock

ReadWriteLock是一个接口,常见的实现是ReentrantReadWriteLock。

    public static void main(String[] args) {
        final JUCMain main = new JUCMain();
        // 建N个线程,同时读
        ExecutorService service = Executors.newCachedThreadPool();
        service.execute(new Runnable() {
            @Override
            public void run() {
                main.readFile(Thread.currentThread());
            }
        });
        // 建N个线程,同时写
        ExecutorService service1 = Executors.newCachedThreadPool();
        service1.execute(new Runnable() {
            @Override
            public void run() {
                main.writeFile(Thread.currentThread());
            }
        });
        System.out.println("begin");

    }


    ReentrantReadWriteLock lock = new ReentrantReadWriteLock();

    public void readFile(Thread thread){
        lock.readLock().lock();
        boolean readLock = lock.isWriteLocked();
        if(!readLock){
            System.out.println("当前为读锁!");
        }
        try{
            for(int i=0; i<5; i++){
                try {
                    Thread.sleep(20);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println(thread.getName() + ":正在进行读操作……");
            }
            System.out.println(thread.getName() + ":读操作完毕!");
        }finally{
            System.out.println("释放读锁!");
            lock.readLock().unlock();
        }
    }
    // 写操作
    public void writeFile(Thread thread){
        lock.writeLock().lock();
        boolean writeLock = lock.isWriteLocked();
        if(writeLock){
            System.out.println("当前为写锁!");
        }
        try{
            for(int i=0; i<5; i++){
                try {
                    Thread.sleep(20);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println(thread.getName() + ":正在进行写操作……");
            }
            System.out.println(thread.getName() + ":写操作完毕!");
        }finally{
            System.out.println("释放写锁!");
            lock.writeLock().unlock();
        }
    }

Semaphore

Semaphore的原意是旗语,技术文档中常翻译成信号量。

    private static Semaphore semaphore = new Semaphore(2);

    public static void main(String[] args) {

        ExecutorService service = Executors.newFixedThreadPool(5);
        for (int i = 0; i < 4; i++) {
            service.execute(new Runnable() {
                @Override
                public void run() {
                    try{
                        System.out.println("require_permit"+Thread.currentThread().getId());
                        semaphore.acquire();
                        System.out.println("begin"+Thread.currentThread().getId());
                        Thread.sleep(1000);
                        System.out.println("end"+Thread.currentThread().getId());
                    }catch (Exception e){
                        e.printStackTrace();
                    }finally {
                        semaphore.release();
                        System.out.println("release_permit"+Thread.currentThread().getId());
                    }

                }
            });
        }
    }

上述程序的输出是
require_permit10
require_permit12
begin10
require_permit11
begin12
require_permit13
end10
end12
release_permit10
begin11
release_permit12
begin13
end11
end13
release_permit11
release_permit13

JUC 常见的锁 目录一、AtomicInteger1、底层实现(1) 如果在执行CAS操作的时候,在判断值是否为我期望的值后,马上有其他线程把这个值改为了其他的值,那这种情况不是依然有问题吗?(2)ABA问题(3)CAS底层是怎么做到的?2、SyncLong VS AtomicLong VS LongAdder二、ReentrantLock1、公平锁与非公平锁2、reentrantlock VS synchronized三、CountDownLatch(倒数 门闩)四、CyclicBarrier (循环 栅栏)五、Phas 阅读详情

相关推荐

【商业化】【msix打包】Python 应用打包为 MSIX 的正确流程:入口点问题与解决方案

发现用msix打包工具打包python做的exe时总找不到程序入口点,后来理了一下才发现自己误会了,需要先生成一个基本的setup.exe,msix的打包是基于这个初始的安装程序进行的。只需要点击Buile-》Compile,然后Open Output Folder就可以得到exe安装程序了。可以使用免费工具inno setup来创建初始安装包。其中{group}这样的变量会自动匹配,不用自己指定。如果点击Run会运行安装程序。

每日出拳老爷子的博客 1105

Java常见Lock(四):lock之Semaphore、CountDownLatch、StampedLock

Semaphore、CountDownLatch、StampedLock

SayNight 1155

量子城域网建设设备系列(三):网络管理系统(NMS)

本文对量子网络中的网络管理系统进行了初步的介绍。

量子领域相关话题 2013

多线程基础(三)JUC并发包:Lock锁、CountDownLath、CyclicBarrier、Semaphore、LockSupport

多线程基础(三)JUC并发包:Lock锁、CountDownLath、CyclicBarrier、Semaphore、LockSupport

m0_47743175的博客 1132

无需云服务器:飞牛云NAS+Docker搭建本地WordPress站点全球访问

在数字化浪潮中,网站搭建已成为个人和企业在推广自身品牌与业务的首要选择。飞牛云新推出的fnOS,这款集多功能于一身的nas系统,以其卓越的性能和灵活性,成为理想的本地网站部署平台。本文将带你一探如何在飞牛云NAS上通过Docker部署WordPress,并利用cpolar实现全球访问。

LT15171009269的博客 6529

surfer10与Arcgis10.3 完美生成等值线和等值面方法

surfer10 与Arcgis10.3生成等值线和等值面的步骤如下: 1.准备surfer用的Book1.dat文件,格式如下: "x" "y" "z" 116.471992 40.809975 232 116.335556 40.700542 1235 116.541626 40.713333 214 116.73349 40.798607 566 2.在surfer中,选择Gr

哈里·雪利博客 1万+

java lock 信号_java各种锁(ReentrantLock,Semaphore,CountDownLatch)的实现原理

先放结论:主要是实现AbstractQueuedSynchronizer中进入和退出函数,控制不同的进入和退出条件,实现适用于各种场景下的锁。JAVA中对于线程的同步提供了多种锁机制,比较著名的有可重入锁ReentrantLock,信号量机制Semaphore,队列等待机制CountDownLatch,通过查看源代码可以,他们都是基于AbstractQueuedSynchronizer实现了自身的...

weixin_26705191的博客 320

4、分布式发电系统中用于改善电能质量的有源、无源和混合滤波器

本文探讨了分布式发电系统中,尤其是光伏(PV)系统运行过程中引入的电能质量问题,并分析了有源滤波器、无源滤波器及混合滤波器在改善电能质量方面的应用。文章详细介绍了光伏系统的建模、最大功率点跟踪(MPPT)技术,以及谐波、电压波动等技术问题,同时对各类滤波器的拓扑结构和控制方法进行了系统性总结。通过仿真实例比较了不同滤波器在减少谐波方面的效果,为实际工程应用提供了参考依据。

transformer2023的博客 91

信号量Semaphore,读写锁ReadWriteLock,计数器CountDownLatch,循环栅栏CyclicBarrier运用

1.信号量Semaphore: 像synchronized, ReentrantLock等这些对临界区资源进行同步后,所有对临界区资源进行访问的线程都得串行排队,而信号量允许指定的线程数同时进行访问 demo: import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import ...

欣淡定的博客 609

PPT里文字太多如何排版-一口气教你7种布局瞬间让PPT高大上起来

PPT里全是文字且很拥挤怎么办?本篇教你使用7种不同的排版让你的PPT瞬间变得高大上起来。

打造全国最全的AI Agent开发知识领域的博客 5025

ConvNeXt 系列改进:二次创新 ConvNeXt:结合 RepVGG 结构重参数化,训练多分支、推理单路

2026年的视觉模型赛道呈现出一种有趣的“返璞归真”趋势——在Transformer狂飙数年之后,卷积网络正以全新的姿态回归。这其中,ConvNeXt无疑是纯卷积阵营中最耀眼的明星。从2022年Meta AI首次提出至今,ConvNeXt系列已经走过了近四年的演进之路,衍生出ConvNeXt V2、E-ConvNeXt等多个增强版本。ConvNeXt的7×7深度卷积带来了不错的感受野,却也埋下了推理效率的隐患。

ZXSXJ的博客 234

Java中的锁(七)

本章主要介绍Java中的计数器CountDownLatch。 一、CountdownLatch的基本概念 countdownLatch也叫闭锁,与cyclicBarrier一样,也是在jdk1.5中的并发包引入的。CountDownLatch内部会维护一个初始值为线程数量的计数器,主线程执行await方法,如果计数器大于0,则阻塞等待。当一个线程完成任务后,计数器值减1。当计数器为0时,表示所...

西木风落 287

Labview项目01:标准可配置序列测试框架

摘要:本文介绍了一个基于LabVIEW2020开发的通用测试框架系统。该系统采用模块化设计,包含主界面、调试界面、设置界面和登录界面。主功能包括:1)可配置测试序列,支持延时、预定值输出、随机值输出等操作;2)单步测试功能自主添加;3)界面支持测试序列编辑和权限管理。系统采用队列机制处理事件和测试流程,通过CSV文件存储测试序列,支持参数化配置。用户可自定义测试VI(A_.vi和N_.vi格式),并通过调试界面验证测试序列。最终测试结果在主界面显示,提供整体判断功能。该系统既可作为学习参考,也可用于实际测试

weixin_38637405的博客 1552

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

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

百锦再的博客 1169

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

JUC并发编程

JUC并发编程 JUC简介 进程、线程的关系 Java默认有两个线程 线程的六种状态 并发、并行的关系: Lock锁 Synchronized 和 Lock的区别 8锁现象 问题一 : 在标准情况下,两个线程先打印 发短信 还是 打电话 ? 问题二 : 在发短信方法中,延迟4秒,两个线程先打印 发短信 还是 打电话? 问题三 : Phone类增加一个普通方法,线程B调用,那么两个线程先打印 发短信

识时务者的个人博客 14万+

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

JUC 常用工具类:CountDownLatch、CyclicBarrier、Semaphore

│ JUC 工具类 ││ ││ CountDownLatch 等所有人都完成,主线程才继续 ││ ↓ ││ CyclicBarrier 等所有人都到齐,一起开始 ││ ↓ ││ Semaphore 只有N个许可,限流用的 ││ ↓ ││ ReadWriteLock 读写分离,读并行,写独占 ││ ↓ ││ StampedLock 更快的读写锁,乐观读优化 ││ │工具类核心思想典型场景倒数计数等子任务完成、启动等待互相等待多线程汇总、赛车发车Semaphore。

2301_79404691的博客 927

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

JUC学习笔记

1.SaleTicket //资源类 = 实例变量 + 实例方法 class Ticket{ //票 private int number = 30; Lock lock = new ReentrantLock(); public void sale(){ lock.lock(); try { if (number > 0){ System.out.println(Thread.

lizongxiao的博客 1万+

【JUC辅助工具类】CountDownLatch - CyclicBarrier - Semaphore

【JUC辅助工具类】CountDownLatch - CyclicBarrier - Semaphore

iqqcode 753

JUC各种同步锁:CountDownLatch、CyclicBarrier、MarriagePhaser、ReadWriteLock、Semaphore、Exchanger、LockSupport

1、CountDownLatch (门栓锁) CountDownLatch是一个同步工具类,用来协调多个线程之间的同步,或者说起到线程之间的通信(而不是用作互斥的作用)。 CountDownLatch能够使一个线程在等待另外一些线程完成各自工作之后,再继续执行。使用一个计数器进行实现。计数器初始值为线程的数量。当每一个线程完成自己任务后,计数器的值就会减一。当计数器的值为0时,表示所有的线程都已经完成一些任务,然后在CountDownLatch上等待的线程就可以恢复执行接下来的任务。 CountDownLa

quokka的博客 431

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

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

tttalk的博客 1281

各种JUC同步锁:CountDownLatch、CyclicBarrier、MarriagePhaser、ReadWriteLock、Semaphore、Exchanger、LockSupport

1、CountDownLatch CountDownLatch是一个同步工具类,用来协调多个线程之间的同步,或者说起到线程之间的通信(而不是用作互斥的作用)。 CountDownLatch能够使一个线程在等待另外一些线程完成各自工作之后,再继续执行。使用一个计数器进行实现。计数器初始值为线程的数量。当每一个线程完成自己任务后,计数器的值就会减一。当计数器的值为0时,表示所有的线程都已经完成一些任务,然后在CountDownLatch上等待的线程就可以恢复执行接下来的任务。 CountDownLatch的用法

软软的铲屎官的博客 442

JUC第三课——复习、ReentrantLock、CountDownLatch、CyclicBarrier、Phaser、ReadWriteLock、Semaphore、Exchanger

CAS复习 类似乐观锁,是使用CPU的原语实现 cas(期望值,更新值) 例子: m = 0; m++; cas(0,1){ for(;;)如果当前值==0 则m=1 } AtomicXX类 package character02; import java.util.ArrayList; import java.util.List; import java.util.concurrent.atomic.AtomicInteger; /** * 解决同样问题的更高效的方法,使用AtomXX类 * At

upset_poor的博客 244

JUC-java.util.concurrent学习(二)---Callable,CountDownLatch,CyclicBarrier,Semaphore,ReadWriteLock

JUC-java.util.concurrent学习(二) Callable Runnable是不能返回结果的,不能抛出异常的 @FunctionalInterface public interface Callable<V> { /** * Computes a result, or throws an exception if unable to do so. * * @return computed result * @throws Exc

Actor2的博客 403

JUC三大辅助类(CountDownLatch、CyclicBarrier和Semaphore)、ReadWriteLock(读写锁)和BlockingQueue(阻塞队列)

JUC三大辅助类(CountDownLatch、CyclicBarrier和Semaphore)、ReadWriteLock(读写锁)和BlockingQueue(阻塞队列) CountDownLatch:减少计数方法 作用:让一些线程阻塞直到另一些线程完成一系列操作后才被唤醒。 提供的三个方法: new CountDownLatch(6);设置计数器为6个线程 countDown();将计数器...

DengShengL的博客 560

Java多线程Day17-JUC锁基本概念

JUC锁基本概念基本概念同步锁JUC锁LockReentrantLock**ReentrantLock**锁包括公平的**ReentrantLock**和非公平的**ReentrantLock:**ReadWriteLockLockSupportConditionAbstractQueuedSynchronizerAbstractQueuedLongSynchronizerAbstractOwnableSynchronizer 基本概念 根据锁添加到Java中的时间 ,Java中的锁分为同步锁和JUC包中

攻城狮Chova的博客 739

JUC-ReentrantLock锁基础篇

ReentrantLock是一种可重入的独占锁(互斥锁)。 独占锁: 一个线程获取()了这把锁,其他的线程则不能获取。 可重入:指的是线程A获取了这把锁,在线程A释放锁之前,线程A本身可以继续来获取这把锁。比如线程A调了了lock()方法获取了这把锁,在线程A调用unlock()方法之前,线程A本身继续调用lock()方法并不会阻塞住。重入锁的设计目的是为了解决死锁的问题。 ReentrantLock常常与Synchronized做对比,它们之间的对比如下:ReentrantLock提供的一些常用的方法有:

zqj1172102457的博客 685
上一篇: JUC的AQS的第一部分
下一篇: JUC之线程池
define_us
博客等级 码龄14年 157粉丝 531原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值