AQS的同步组件应用:CountDownLatch、Cyclicbarrier、Semaphore

爬取百度图片 最开始,我们想要爬取图片,首先需要打开百度图库,然后在搜索栏中输入自己想要的图片(比如说壁纸)。接着右键检查,点击网络:起初可能没有名称信息,刷新界面就可以了。打开信息,查看标头内容可以看到请求URL为:复制这串URL,然后在浏览器中打开这个就是我们搜索的壁纸图片的网页内容。怎么找到图片的URL呢?在上述内容中,找到data,可以发现里面每隔一个aiEditData,下面代码的形式是一样的,就相当于一张图片。 阅读详情

同步:并发的线程在某一关键点上可能需要相互等待通知或互通消息,这种机制叫线程同步。

他们几个底层实现都是AQS,是jdk并发包里提供的并发工具类,注意,他们是工具类,跟我们平时自己写的或使用的工具类一样,目的是帮助我们处理并发的流程控制或解决我们多线程时遇到的一些问题(如:多线程互相等待通知、模拟并发等)

CountDownLatch

可以让线程等待其他线程完成操作后自己再干。

它跟join类似,可以让主线程暂停子线程先去执行;它又比join灵活,join只能是子线程完全执行完才会通知主线程,countDownLatch可以让子线程在任意时刻显示通知主线程,主线程接到通知后可以跟子线程一块执行;实现功能又可以跟FutureTask差不多,FutureTask可以返回子线程处理任务的状态,主线程里不断的while循环判断判断子线程状态是否是done,这种方式占用的是cpu资源,因为他要忙循环不断检查所有子线程都处理完,countDownLatch的实现机制是主线程暂停后就“挂起”了,释放了cpu,等所有子线程完成后再通知主线程,这种方式引起线程间上下文切换,耗性能。

用法:

public class CountDownLatchTest {
    public static void main(String[] args) {
        CountDownLatch taskLock = new CountDownLatch(3);
       Thread thread1 = new Thread(()->{
               String name = Thread.currentThread().getName();
               System.out.println(name+":处理业务");
               taskLock.countDown();
               System.out.println(name+":调用完毕释放资源,同步状态剩余:"+taskLock.getCount());
       },"Thread-1");
        Thread thread2 = new Thread(()->{
                String name = Thread.currentThread().getName();
                System.out.println(name+":处理业务");
                taskLock.countDown();
                System.out.println(name+":调用完毕释放资源,同步状态剩余:"+taskLock.getCount());
        },"Thread-2");
        Thread thread3 = new Thread(()->{
                String name = Thread.currentThread().getName();
                System.out.println(name+":处理业务");
                taskLock.countDown();
                System.out.println(name+":调用完毕释放资源,同步状态剩余:"+taskLock.getCount());
        },"Thread-3");

        System.out.println("----------主线程 开始了,并开启多个线程处理业务------------");
        thread1.start();
        thread2.start();
        thread3.start();
        System.out.println("主线程遇到同步状态,需要做同步,进入等待状态,暂停了——————");
//主线程调用await方法后就被阻塞了,当子线程countdown后给同步状态减1,直到减到0,主线程继续执行
//      taskLock.await(2000, TimeUnit.MILLISECONDS);
        taskLock.await();
        System.out.println("主线程被通知到又可以继续走了"+taskLock.getCount());

    }
}
-----------------主线程 开始了,并开启多个线程处理业务------------
主线程遇到同步状态,需要做同步,进入等待状态,暂停了——————
Thread-3:处理业务
Thread-3:调用完毕释放资源,同步状态剩余:2
Thread-2:处理业务
Thread-2:调用完毕释放资源,同步状态剩余:1
Thread-1:处理业务
主线程被通知到又可以继续走了0
Thread-1:调用完毕释放资源,同步状态剩余:0

1、countDownLatch创建时传入同步状态数(给state赋值),几个子线程就设置几;

2、主线程调用await后被阻塞,直到state值为0被唤醒;

3、子线程调一次countDown就给state减1,直到减到0后唤醒主线程。

CountDown Latch底层实现利用的AQS,对同步状态变量做减法,主要的两个方法await和countDown,类似于监视器的await和notify,底部对线程的阻塞利用的LockSupport的park和unpark,通过countDown Latch进行多线程之间的调度,实现多线程的同步。

CyclicBarrier

同步屏障:让一组线程到达某个点后一块执行。

类似于一个屏障,拦住线程,等都到达后再同时放行,并且它的同步状态还可以再循环利用。它的应用可以模拟并发,也可以让一个线程等待多个线程都执行完后再综合处理各个线程的结果。

用法:

public class CyclicBarrierTest {

    static CyclicBarrier cyclicBarrier = new CyclicBarrier(3,new Thread(()->{
            System.out.println("初始化了---3个线程---大家一块执行");
    }));

    public static void main(String[] args) {
        ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(3,3,0L, TimeUnit.SECONDS,new ArrayBlockingQueue<>(3));
            threadPoolExecutor.submit(()->{
                try {
                    System.out.println("我是1=="+System.currentTimeMillis());
                    cyclicBarrier.await();
                    System.out.println("我是1处理逻辑=="+System.currentTimeMillis());
                } catch (Exception e) {}
            });
            threadPoolExecutor.submit(()->{
                try {
                    Thread.sleep(1000);
                    System.out.println("我是2=="+System.currentTimeMillis());
                    cyclicBarrier.await();
                    System.out.println("我是2处理逻辑=="+System.currentTimeMillis());
                } catch (Exception e) {}
            });
            threadPoolExecutor.submit(()->{
                try {
                    Thread.sleep(2000);
                    System.out.println("我是3=="+System.currentTimeMillis());
                    cyclicBarrier.await();
                    System.out.println("我是3处理逻辑=="+System.currentTimeMillis());
                } catch (Exception e) {}
            });
            threadPoolExecutor.shutdown();
    }
}
我是1==1640917282738
我是2==1640917283741
我是3==1640917284740
初始化了---3个线程---大家一块执行
我是3处理逻辑==1640917284740
我是1处理逻辑==1640917284740
我是2处理逻辑==1640917284740

1、CyclicBarrier创建时传入同步状态数(给state赋值),几个子线程就设置几;

2、子线程调用await后被阻塞;

3、子线程调一次await就给state减1,直到state值为0时全部线程才被唤醒

CyclicBarrier底层实现利用的AQS,对初始的同步状态变量做减法,利用可重入锁ReentrantLock和等待condition条件实现,加锁保证多线程时只有一个修改同步状态,然后判断同步修改后的同步状态是否等于0,等于0就唤醒等待在condition上的所有线程,不为0,当前线程就在condition条件上挂起。

Semaphore

信号量:它实现的也是线程之间的调度

它采用的同步状态递增的形式实现调度。初始化设置同步状态是0,一组线程让他增,一组线程让他减,始终围绕0做判断就行。信号量有公平和非公平两种策略。

用法:

public class SemaphoreTest3 {

    public static void main(String[] args) {
        Semaphore semaphore = new Semaphore(0);
        ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(3,3,0L, TimeUnit.SECONDS,new ArrayBlockingQueue<>(3));
        threadPoolExecutor.submit(()->{
            try {
                System.out.println("我是1=我给一个信号量="+System.currentTimeMillis());
                semaphore.release(1);
            } catch (Exception e) {}
        });
        threadPoolExecutor.submit(()->{
            try {
                Thread.sleep(1000);
                System.out.println("我是2==我给两个信号量="+System.currentTimeMillis());
                semaphore.release(2);
            } catch (Exception e) {}
        });
        threadPoolExecutor.submit(()->{
            try {
                Thread.sleep(2000);
                System.out.println("我是3=我给一个信号量="+System.currentTimeMillis());
                semaphore.release(1);
            } catch (Exception e) {}
        });
        threadPoolExecutor.shutdown();
        try {
            System.out.println("主线程走着走着就被暂停了,我需要4个信号量");
            semaphore.acquire(4);//同步状态是-4
            System.out.println("主线程被唤醒了,又可以继续了");
        } catch (InterruptedException e) {}
    }
}
主线程走着走着就被暂停了,我需要4个信号量
我是1=我给一个信号量=1640921214160
我是2==我给两个信号量=1640921215162
我是3=我给一个信号量=1640921216161
主线程被唤醒了,又可以继续了

调用acquire就是阻塞,唤醒的条件就是需要传入参数的数量,调用release就是唤醒线程,只不过条件是要到达acquire的值。

1、信号量初始时同步状态设置为0,

2、调用acquire传入值,阻塞线程,同步状态值改为0减去新传入的值(负数)

3、调用release传入值,同步状态加上该值,当同步状态再次为0的时候唤醒线程。

搭建自己的MQTT服务器,实现设备上云(Ubuntu+EMQX) 这篇文章教大家在ECS云服务器上部署EMQX,搭建自己私有的MQTT服务器,配置EMQX实现设备上云,设备数据转发,存储;服务器我采用的华为云的ECS服务器,系统选择Ubuntu系统。 阅读详情

相关推荐

Q&A | ZStack替代VMware实问实答

ZStack替代VMware实问实答

zstack_org的博客 1801

并发编程-16AQS同步组件之CountDownLatch 闭锁

文章目录脑图CountDownLatch闭锁示例Thread#join()CountDownLatchCountDownLatch示例二 await一直等待其他线程执行完CountDownLatch示例三 await指定等待时间小结代码 脑图 CountDownLatch闭锁 Java 5.0 在 java.util.concurrent 包中提供了多种并发容器类来改进同步容器...

小工匠 2万+

SD - WAN:企业出海的网络加速器

例如,一家中国的跨境电商企业,在欧美市场的促销活动期间,借助 SD - WAN 技术,即使面对海量订单数据的交互,也能确保欧美客户在浏览商品、下单支付时感受到近乎本地网络的流畅体验,大大提升了客户满意度,稳住了销售增速。企业无需在海外本地部署大量冗余服务器,只需依托云台,借助 SD - WAN 快速稳定的网络连接,即可轻松实现业务拓展,进一步精简运营架构,提升整体效能。在未来,随着技术的不断演进和企业出海需求的持续增长,SD - WAN 将持续赋能,助力更多企业在全球市场扬帆远航,书写辉煌篇章。

idcicp_com的博客 446

高并发之——浅谈AQS中的CountDownLatch、Semaphore与CyclicBarrier

CountDownLatch 概述 同步辅助类,通过它可以阻塞当前线程。也就是说,能够实现一个线程或者多个线程一直等待,直到其他线程执行的操作完成。使用一个给定的计数器进行初始化,该计数器的操作是原子操作,即同时只能有一个线程操作该计数器。 调用该类await()方法的线程会一直阻塞,直到其他线程调用该类的countDown()方法,使当前计数器的值变为0为止。每次调用该类的countDown()...

冰河的专栏 1998

faster lio 回环 加入GTSAM优化的记录

对Faster lio 加入回环、gtsam优化,在室外建图遇到的问题和过程

Nico_jion的博客 2599

【SPSS操作】Non-parametric ANCOVA (Quade‘s) in SPSS

在SPSS中执行Quade的非参数ANCOVA需要手动计算步骤,因为SPSS没有内置的菜单选项。以下是详细的操作指南。

weixin_43689393的博客 1278

AQS原理应用(一):CountDownLatch的典型用法和实现原理

一、基本概念 CountDownLatch 是一个同步工具类,它允许一个或多个线程一直等待,直到其他线程的操作执行完后再执行。 二、CountDownLatch 的三种典型用法 (1) 某一线程在开始运行前等待 n 个线程执行完毕。将 CountDownLatch 的计数器初始化为 n :new CountDownLatch(n),每当一个任务线程执行完毕,就将计数器减 1 countdownla...

by_yanzhenshun的博客 683

飞书文档API深度使用指南:如何用n8n社区节点绕过HTTP Request的复杂配置

本文详细解析了如何利用n8n社区节点简化飞书文档API的集成过程,绕过复杂的HTTP Request配置。通过n8n-feishu-lite社区节点,开发者可以轻松实现飞书文档的创建、编辑和查询操作,大幅提升自动化工作流的效率。文章还提供了高级应用场景和性能优化建议,帮助开发者更好地利用飞书开放平台的API功能。

weixin_29227585的博客 83

一篇文章彻底搞懂AQS共享工具类CountDownLatch(深度剖析)

围绕CountDownLatch是什么,如何使用、实现原理、核心源码分析、以及和cyclicBarrier区别

大尾巴狼学编程的博客 881

【硬件】LT3763中文手册

1)精确控制输入和输出电流;2) 3000:1真彩色PWM™调光;3) ±1.5%电压调节精度;4) ±6%电流调节精度;5)6V至60 V输入电压范围;6)宽输出范围最高可达55V;7)<2µA关断电流;8)用于负载电流热控制的控制引脚;9)输入和输出电流监控和限制;10)开路、短路和C/10故障检测;11)适用于LED应用的PWM驱动器输出;12)热增强型28引脚FE封装。

qq_39200110的博客 489

pandas教程:2012 Federal Election Commission Database 2012联邦选举委员会数据库

里面包含了支持者的名字,职业和雇主,地址,赞助金额。我们可以已经能想到如何切割、整理数据,来提取赞助者的统计数据,或提取宣传活动的模式,这里我们展示一些不同的分析方法。可以看到有些职业是同一种工作类型,指代的是同一个东西。这两个连续操作是分别独立执行的,一个结束后,另一个才开始。上,这里我是把数据集压缩成了ZIP格式,解压后能正常导入)。我觉得也有必要好好了解一下,这个网站做了很好的讲解,),所以我们最好添加这样的信息。这样的情况,即把两个索引操作连在一起。,发现映射关系被正常执行了,所以这里的。

Cachel Wood的博客 350

AQS之CountDownLatch

CountDownLatch是java并发包中一个常见的类,本文将从源码的角度来分析CountDownLatch的实现原理,而CountDownLatch是基于AQS的共享锁模式来实现的,所以需要对AQS有一定的了解。

Epoch_Elysian的博客 648

Python散点图(Scatter Plot):高阶分析、散点图矩阵、三维散点图及综合应用

散点图作为一种直观且功能强大的数据可视化工具,在数据分析中具有广泛的应用。通过观察散点图中数据点的分布模式,我们可以轻松地判断变量之间是否存在相关性,以及相关性的类型和强度。同时,散点图也是识别数据集中异常值的有效工具,无论是通过直观观察还是结合统计方法,都能帮助我们发现数据中的异常情况。掌握散点图的绘制和分析技巧,将使我们在数据探索和决策制定中更加得心应手。

SiArch的博客 1444

慕课网实战·高并发探索(十一):并发容器J.U.C -- AQS组件CountDownLatch、Semaphore、CyclicBarrier

特别感谢:慕课网jimin老师的《Java并发编程与高并发解决方案》课程,以下知识点多数来自老师的课程内容。 jimin老师课程地址:Java并发编程与高并发解决方案 AQS简介 AQS设计思想 AQS的大致实现思路 AQS组件:CountDownLatch AQS组件:Semaphore AQS组件:CyclicBarrier AQS简介 AQS全名:Abstr...

Never Give Up 2099

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

NTscan扫描工具

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

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

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

liuwd的博客 226

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

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

【并发编程-基础】(六)AQS同步组件

文章目录一、AQS介绍二、AQS常用同步组件2.1、CountDownLatch(倒计时器)       2.1.1、CountDownLatch简介       2.1.2、CountDownLatch 使用2.2、Semaphore(信号量)(牛逼)&nb...

tangxz的博客 377

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

【java并发编程】AQS框架

简介 aqs全称抽象队列同步器是AbstractQueuedSynchronize抽象类。 它是一个用来构建锁和同步器的框架,它底层用了CAS技术来保证操作的原子性,同时利用FIFO队列实现线程间的锁竞争,将基础的同步相关抽象细节放在AQS,它能够成为实现大部分同步需求的基础,也是JUC并发包同步的核心基础组件。Lock、ReadWriteLock、CountDowndLatch、CyclicBarrier、Semaphore、ThreadPoolExecutor等都是在AQS的基础上实现的。 A.

sumengnan的博客 1368

java并发之 AQS相关同步组件理解及源码分析

写在前面 之前有写过AQS的相关博文,那么本文就来写写使用AQS相关的同步组件。 AQS是java中提供用来构建同步组件的基础框架,它提供了基本的同步状态管理,线程阻塞、排队、唤醒机制。从而方便用户来自定义同步组件。 在java并发包中,也有不少组件使用了AQS。 下面来简单的介绍一下使用到AQS的常用的同步组件。 这里我们按照AQS的资源共享方式来分类: 独占式:ReentrantLock 共享式:Semaphore、CountDownLatch、CycliBarrier 独占+共享式:读写锁 Ree

或左的博客 210

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

java高并发7.1 AQS--CountDownLatch, Semaphore, CyclicBarrier

文章包含了: AQS简介 AQS设计思想 AQS的大致实现思路 AQS组件:CountDownLatch AQS组件:Semaphore AQS组件:CyclicBarrier AQS简介 AQS全名:AbstractQueuedSynchronizer,是并发容器J.U.C(java.lang.concurrent)下locks包内的...

Linias的博客 695

AQS同步组件

队列同步器AQS:同步状态(共享资源)state + CLH同步队列(内置FIFO队列,请求共享资源的线程),用来构建锁或者其他同步组件的基础框架,既可以支持独占式地获取同步状态,也可以支持共享式地获取同步状态,这样就可以方便实现不同类型的同步组件 独占式组件 ReentrantLock:重入锁,不同线程不能共享访问共享资源,分为公平锁和非公平锁模式,实现Lock接口 state为0:资源可用,state为1:资源正被一个线程使用 Mutex 共享式组件 Semaphore:限制某种资源的线程数量,也

Joker小兮的博客 190

Java的Lock实现类介绍

Java的Lock实现类介绍 Java的Lock实现类介绍 所的实现类:AQS(AbstractQueuedSynchronizer)、ReentrantLock、ReentrantReadWriteLock,CountDownLatch,Semphore。 其他多线程协作的场景: CyclicBarrier。 AQS源码解析。 Lock类介绍 Lock类相关介绍 Lock重要的实现类:Re...

K-Darker的专栏 8231

AQS的几个同步组件

AQS的几个同步组件 CountDownLatch 一个线程或多个线程一直等待,直到其他线程执行的操作完成才继续执行。 应用:并行计算。 计数器是不能重计的,计数值不能往上加,类似操作只有一次。 使用时首先new一个countDownLatch,构造方法中放入计数,然后在一个线程中调用await方法,这个线程就会进入等待状态,其他线程中调用countDown方法减少这个计数,直至降到0...

dig73817的博客 165

带你了解JAVA中的AQS介绍(AbstractQueuedSynchronizer)

带你了解JAVA中的AQS介绍(AbstractQueuedSynchronizer)

YmovomY的博客 1278

J.U.C之AQS之 CountDownLatch、Semaphore、CyclicBarrier

J.U.C之AQS - 介绍 J.U.C(java.util.concurrent)在jdk1.5引入,引入J.U.C大大提高了java的并发性能,AQS(AbstractQueuedSynchronizer的缩写) 可以认为是J.U.C的核心,AQS 可以说是并发类中的重中之重,AQS 提供了基于firstIn,firstOut队列,这个队列可以用来构建锁或者其他相关的同步装置的基础框架 A...

坚定目标,超越自我 468

java中同步组件_java面试--AQS原理及AQS同步组件

AQS 原理概览AQS的核心思想为:如果被请求的共享资源空闲,则将当前请求资源的线程设置为有效的工作线程,且将共享资源设置为锁定状态。如果被请求的共享资源被占用,那么就需要一套线程阻塞等待以及被唤醒时锁分配的机制,这个机制AQS是使用CLH队列锁实现的,即将暂时获取不到锁的线程加入到队列中。它只是定义了一套多线程访问共享资源的框架CLH队列是一个虚拟的双向队列(不存在队列的实例,只存在节点之间的关...

weixin_31874327的博客 178
上一篇: mysql 数据库忘记密码
下一篇: maven 项目resource下的文件编译后改变大小
csdn_binger
博客等级 码龄11年 2粉丝 11原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值