202205-17 Java中CyclicBarrier和CountDownLatch的用法与区别 目录前言CountDownLatch例子CyclicBarrier构造函数例子两者区别前言CyclicBarrier和CountDownLatch这两个工具都是在java.util.concurrent包下,并且平时很多场景都会使用到。本文将会对两者进行分析,记录他们的用法和区别。CountDownLatchCountDownLatch是一个非常实用的多线程控制工具类,称之为“倒计时器”,它允许一个或多个线程一直等待,直到其他线程的操作执行完后再执行。CountDownLatch是通过一个计数器来实现的,计数器... 继续阅读 >
202110-12 Java实现限定时间CountDownLatch并行场景 目录业务场景:解决方案:总结业务场景:一个用户数据接口,要求在20ms内返回数据,它的调用逻辑复杂,关联接口多,需要从3个接口汇总数据,这些汇总接口最小耗时也需要16ms,全部汇总接口最优状态耗时需要16ms*3=48ms解决方案:使用并行调用接口,通过多线程同时获取结果集,最后进行结果整合。在这种场景下,使用concurrent包的CountDownLatch完成相关操作。CountDownLatch本质上是一个计数器,把它初始化为与执行任务相同的数量... 继续阅读 >
202109-30 详解Java中CountDownLatch异步转同步工具类 使用场景由于公司业务需求,需要对接socket、MQTT等消息队列。众所周知socket是双向通信,socket的回复是人为定义的,客户端推送消息给服务端,服务端的回复是两条线。无法像http请求有回复。下发指令给硬件时,需要校验此次数据下发是否成功。用户体验而言,点击按钮就要知道此次的下发成功或失败。如上图模型,第一种方案使用Tread.sleep优点:占用资源小,放弃当前cpu资源缺点:回复速度快,休眠时间过长,仍然需要等待休眠结... 继续阅读 >
202105-20 Java并发编程之CountDownLatch源码解析 一、前言CountDownLatch维护了一个计数器(还是是state字段),调用countDown方法会将计数器减1,调用await方法会阻塞线程直到计数器变为0。可以用于实现一个线程等待所有子线程任务完成之后再继续执行的逻辑,也可以实现类似简易CyclicBarrier的功能,达到让多个线程等待同时开始执行某一段逻辑目的。二、使用一个线程等待其它线程执行完再继续执行......CountDownLatchcdl=newCountDownLatch(10);ExecutorServicees... 继续阅读 >
202102-21 Java骚操作之CountDownLatch代码详解 简述用来干嘛的?当你在方法中调用了多个线程,对数据库进行了一些不为人知的操作后,还有一个操作需要留到前者都执行完的重头戏,就需要用到CountDownLatch了实践代码packagecom.github.gleans;importjava.util.concurrent.CountDownLatch;publicclassTestCountDownLatch{publicstaticvoidmain(String[]args)throwsInterruptedException{CountDownLatchlatch=newCountDownLatch(3);newKeyPass(1000L... 继续阅读 >
202102-21 java多线程CountDownLatch与线程池ThreadPoolExecutor/ExecutorService案例 1、CountDownLatch:一个同步工具类,它允许一个或多个线程一直等待,直到其他线程的操作执行完后再执行。2、ThreadPoolExecutor/ExecutorService:线程池,使用线程池可以复用线程,降低频繁创建线程造成的性能消耗,同时对线程的创建、启动、停止、销毁等操作更简便。3、使用场景举例:年末公司组织团建,要求每一位员工周六上午8点到公司门口集合,统一乘坐公司所租大巴前往目的地。在这个案例中,公司作为主线程,员工作为子线... 继续阅读 >
202102-21 java并发包中CountDownLatch和线程池的使用详解 1.CountDownLatch现在做的这个华为云TaurusDB比赛中,参考的之前参加过阿里的PolarDB大赛的两个大佬的代码,发现都有用到CountDownLatch这个类,之前看代码的时候也看过,但是没有搞得很明白,自己写也写不出来,在此自己先学习一下。字面理解:CountDownLatch:数量减少的门栓。创建这样一个门栓CountDownLatchcountDownLatch=newCountDownLatch(count);参数:count,门栓的计数次数。在所有线程执行完成之前,调用countDownLa... 继续阅读 >
202102-21 java并发学习-CountDownLatch实现原理全面讲解 CountDownLatch在多线程并发编程中充当一个计时器的功能,并且维护一个count的变量,并且其操作都是原子操作。如下图,内部有下staticfinal的Sync类继承自AQS.该类主要通过countDown()和await()两个方法实现功能的,首先通过建立CountDownLatch对象,并且传入参数即为count初始值。如果一个线程调用了await()方法,那么这个线程便进入阻塞状态,并进入阻塞队列。如果一个线程调用了countDown()方法,则会使count-1;当count的值为... 继续阅读 >
202010-15 Java countDownLatch如何实现多线程任务阻塞等待 我这里需要通过多线程去处理数据,然后在所有数据都处理完成后再往下执行。这里就用到了CountDownLatch。把countdownlatch作为参数传入到每个线程类里,在线程中处理完数据后执行countdown方法。在所有countdownlatch归零后,其await方法结束阻塞状态而往下执行。具体代码如下:将多线程任务提交线程池@Bean(name="ggnews_executor")publicExecutorpostExecutor(){ThreadPoolTaskExecutorexecutor=newThreadPoolTas... 继续阅读 >
202010-10 Java CountDownLatch应用场景代码实例 Java的concurrent包里面的CountDownLatch其实可以把它看作一个计数器,只不过这个计数器的操作是原子操作,同时只能有一个线程去操作这个计数器,也就是同时只能有一个线程去减这个计数器里面的值。你可以向CountDownLatch对象设置一个初始的数字作为计数值,任何调用这个对象上的await()方法都会阻塞,直到这个计数器的计数值被其他的线程减为0为止。CountDownLatch的一个非常典型的应用场景是:有一个任务想要往下执行,但必须要... 继续阅读 >
202010-10 基于CyclicBarrier和CountDownLatch的使用区别说明 2018.12.12更新在学习了CyclicBarrier之后发现,CyclicBarrier也可以实现跟CountDownLatch类似的功能,只需要在它的parties中多设置一个数,将主线程加入等待队列就可以了:publicstaticvoidmain(String[]args){ExecutorServicepool=Executors.newCachedThreadPool();intsize=3;//设置参数时,线程实际执行数size+1,将main线程也加到等待队列中CyclicBarriercyclicBarrier=newCyclicBarrier(size+1);... 继续阅读 >
202010-10 详解Java线程同步器CountDownLatch Java程序有的时候在主线程中会创建多个线程去执行任务,然后在主线程执行完毕之前,把所有线程的任务进行汇总,以前可以用线程的join方法,但是这个方法不够灵活,我们可以使用CountDownLatch类,实现更优雅,而且使用线程池的话,可没有办法调用线程的join方法的呀!一.简单使用CountDownLatch直接使用线程:packagecom.example.demo.study;importjava.util.concurrent.CountDownLatch;publicclassStudy0215{//这里... 继续阅读 >
202010-09 如何使用CountDownLatch同步java多线程 最近写了一个并发幂等测试,用线程池加入多个线程,同时启动,领导觉得这样有一定的风险,要求更严格一点,把所有的线程加入池中,然后同时启动。本来有多种方法,因为我们需要从多个线程中获取返回值,所以我们用CountDownLatch来同步多线程。CyclicBarrier也是可以同步多线程的,但因为其无法获取返回值,最后只能选择CountDownLatch.因公司的代码不便共享,这里只提供一小部分代码。CountDownLatchlatch=newCountDownLatch(... 继续阅读 >
202010-08 java并发编程专题(八)----(JUC)实例讲解CountDownLatch CountDownLatch是一个非常实用的多线程控制工具类。”CountDown”在英文中意为倒计数,Latch为门问的意思。如果翻译成为倒计数门阀,我想大家都会觉得不知所云吧!因此,这里简单地称之为倒计数器。在这里,门问的含义是:把门锁起来,不让里面的线程跑出来。因此,这个工具通常用来控制线程等待,它可以让某一个线程等待直到倒计时结束,再开始执行。CountDownLatch的构造函数接收一个整数作为参数,即当前这个计数器... 继续阅读 >
202009-29 详解java CountDownLatch和CyclicBarrier在内部实现和场景上的区别 前言CountDownLatch和CyclicBarrier两个同为java并发编程的重要工具类,它们在诸多多线程并发或并行场景中得到了广泛的应用。但两者就其内部实现和使用场景而言是各有所侧重的。内部实现差异前者更多依赖经典的AQS机制和CAS机制来控制器内部状态的更迭和计数器本身的变化,而后者更多依靠可重入Lock等机制来控制其内部并发安全性和一致性。publicclass{//SynchronizationcontrolForCountDownLatch.//UsesAQSstateto... 继续阅读 >