电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

詳解java CountDownLatch和CyclicBarrier在內部實現和場景上的區別

瀏覽:3日期:2022-09-01 11:28:52

前言

CountDownLatch和CyclicBarrier兩個同為java并發編程的重要工具類,它們在諸多多線程并發或并行場景中得到了廣泛的應用。但兩者就其內部實現和使用場景而言是各有所側重的。

內部實現差異

前者更多依賴經典的AQS機制和CAS機制來控制器內部狀態的更迭和計數器本身的變化,而后者更多依靠可重入Lock等機制來控制其內部并發安全性和一致性。

public class { //Synchronization control For CountDownLatch. //Uses AQS state to represent count. private static final class Sync extends AbstractQueuedSynchronizer { private static final long serialVersionUID = 4982264981922014374L; Sync(int count) { setState(count); } int getCount() { return getState(); } protected int tryAcquireShared(int acquires) { return (getState() == 0) ? 1 : -1; } protected boolean tryReleaseShared(int releases) { // Decrement count; signal when transition to zero for (;;) {int c = getState();if (c == 0) return false;int nextc = c-1;if (compareAndSetState(c, nextc)) return nextc == 0; } } } private final Sync sync; ... ...// }

public class CyclicBarrier { /** * Each use of the barrier is represented as a generation instance. * The generation changes whenever the barrier is tripped, or * is reset. There can be many generations associated with threads * using the barrier - due to the non-deterministic way the lock * may be allocated to waiting threads - but only one of these * can be active at a time (the one to which {@code count} applies) * and all the rest are either broken or tripped. * There need not be an active generation if there has been a break * but no subsequent reset. */ private static class Generation { boolean broken = false; } /** The lock for guarding barrier entry */ private final ReentrantLock lock = new ReentrantLock(); /** Condition to wait on until tripped */ private final Condition trip = lock.newCondition(); /** The number of parties */ private final int parties; /* The command to run when tripped */ private final Runnable barrierCommand; /** The current generation */ private Generation generation = new Generation(); /** * Number of parties still waiting. Counts down from parties to 0 * on each generation. It is reset to parties on each new * generation or when broken. */ private int count; /** * Updates state on barrier trip and wakes up everyone. * Called only while holding lock. */ private void nextGeneration() { // signal completion of last generation trip.signalAll(); // set up next generation count = parties; generation = new Generation(); } /** * Sets current barrier generation as broken and wakes up everyone. * Called only while holding lock. */ private void breakBarrier() { generation.broken = true; count = parties; trip.signalAll(); } /** * Main barrier code, covering the various policies. */ private int dowait(boolean timed, long nanos) throws InterruptedException, BrokenBarrierException,TimeoutException { final ReentrantLock lock = this.lock; lock.lock(); try { final Generation g = generation; if (g.broken)throw new BrokenBarrierException(); if (Thread.interrupted()) {breakBarrier();throw new InterruptedException(); } int index = --count; if (index == 0) { // trippedboolean ranAction = false;try { final Runnable command = barrierCommand; if (command != null) command.run(); ranAction = true; nextGeneration(); return 0;} finally { if (!ranAction) breakBarrier();} } // loop until tripped, broken, interrupted, or timed out for (;;) {try { if (!timed) trip.await(); else if (nanos > 0L) nanos = trip.awaitNanos(nanos);} catch (InterruptedException ie) { if (g == generation && ! g.broken) { breakBarrier(); throw ie; } else { // We’re about to finish waiting even if we had not // been interrupted, so this interrupt is deemed to // 'belong' to subsequent execution. Thread.currentThread().interrupt(); }}if (g.broken) throw new BrokenBarrierException();if (g != generation) return index;if (timed && nanos <= 0L) { breakBarrier(); throw new TimeoutException();} } } finally { lock.unlock(); } } ... ... // }

實戰 - 展示各自的使用場景

/** *類說明:共5個初始化子線程,6個閉鎖扣除點,扣除完畢后,主線程和業務線程才能繼續執行 */public class UseCountDownLatch { static CountDownLatch latch = new CountDownLatch(6); /*初始化線程*/ private static class InitThread implements Runnable{ public void run() { System.out.println('Thread_'+Thread.currentThread().getId() +' ready init work......'); latch.countDown(); for(int i =0;i<2;i++) {System.out.println('Thread_'+Thread.currentThread().getId() +' ........continue do its work'); } } } /*業務線程等待latch的計數器為0完成*/ private static class BusiThread implements Runnable{ public void run() { try {latch.await(); } catch (InterruptedException e) {e.printStackTrace(); } for(int i =0;i<3;i++) {System.out.println('BusiThread_'+Thread.currentThread().getId() +' do business-----'); } } } public static void main(String[] args) throws InterruptedException { new Thread(new Runnable() { public void run() {SleepTools.ms(1);System.out.println('Thread_'+Thread.currentThread().getId() +' ready init work step 1st......');latch.countDown();System.out.println('begin step 2nd.......');SleepTools.ms(1);System.out.println('Thread_'+Thread.currentThread().getId() +' ready init work step 2nd......');latch.countDown(); } }).start(); new Thread(new BusiThread()).start(); for(int i=0;i<=3;i++){ Thread thread = new Thread(new InitThread()); thread.start(); } latch.await(); System.out.println('Main do ites work........'); }}

/** *類說明:共4個子線程,他們全部完成工作后,交出自己結果, *再被統一釋放去做自己的事情,而交出的結果被另外的線程拿來拼接字符串 */class UseCyclicBarrier { private static CyclicBarrier barrier = new CyclicBarrier(4,new CollectThread()); //存放子線程工作結果的容器 private static ConcurrentHashMap<String,Long> resultMap = new ConcurrentHashMap<String,Long>(); public static void main(String[] args) { for(int i=0;i<4;i++){ Thread thread = new Thread(new SubThread()); thread.start(); } } /*匯總的任務*/ private static class CollectThread implements Runnable{ @Override public void run() { StringBuilder result = new StringBuilder(); for(Map.Entry<String,Long> workResult:resultMap.entrySet()){result.append('['+workResult.getValue()+']'); } System.out.println(' the result = '+ result); System.out.println('do other business........'); } } /*相互等待的子線程*/ private static class SubThread implements Runnable{ @Override public void run() { long id = Thread.currentThread().getId(); resultMap.put(Thread.currentThread().getId()+'',id); try { Thread.sleep(1000+id); System.out.println('Thread_'+id+' ....do something ');barrier.await();Thread.sleep(1000+id);System.out.println('Thread_'+id+' ....do its business ');barrier.await(); } catch (Exception e) {e.printStackTrace(); } } }}

兩者總結

1. Cyclicbarrier結果匯總的Runable線程可以重復被執行,通過多次觸發await()方法,countdownlatch可以調用await()方法多次;cyclicbarrier若沒有結果匯總,則調用一次await()就夠了;

2. New cyclicbarrier(threadCount)的線程數必須與實際的用戶線程數一致;

3. 協調線程同時運行:countDownLatch協調工作線程執行,是由外面線程協調;cyclicbarrier是由工作線程之間相互協調運行;

4. 從構造函數上看出:countDownlatch控制運行的計數器數量和線程數沒有關系;cyclicbarrier構造中傳入的線程數等于實際執行線程數;

5. countDownLatch在不能基于執行子線程的運行結果做處理,而cyclicbarrier可以;

6. 就使用場景而言,countdownlatch 更適用于框架加載前的一系列初始化工作等場景; cyclicbarrier更適用于需要多個用戶線程執行后,將運行結果匯總再計算等典型場景;

到此這篇關于詳解java CountDownLatch和CyclicBarrier在內部實現和場景上的區別的文章就介紹到這了,更多相關java CountDownLatch和CyclicBarrier區別內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Java
相關文章:
主站蜘蛛池模板: pos机办理,智能/扫码/二维码/微信支付宝pos机-北京万汇通宝商贸有限公司 | 罐体电伴热工程-消防管道电伴热带厂家-山东沃安电气 | 贝壳粉涂料-内墙腻子-外墙腻子-山东巨野七彩贝壳漆业中心 | 真空包装机-诸城市坤泰食品机械有限公司 | 郑州巴特熔体泵有限公司专业的熔体泵,熔体齿轮泵与换网器生产厂家 | 魔方网-培训咨询服务平台 | 拉力测试机|材料拉伸试验机|电子拉力机价格|万能试验机厂家|苏州皖仪实验仪器有限公司 | 电加热导热油炉-空气加热器-导热油加热器-翅片电加热管-科安达机械 | 安规电容|薄膜电容|陶瓷电容|智旭JEC安规电容厂家 | 合金耐磨锤头_破碎机锤头_郑州市德勤建材有限公司 | 涂层测厚仪_光泽度仪_uv能量计_紫外辐照计_太阳膜测试仪_透光率仪-林上科技 | 上海质量认证办理中心 | 餐饮加盟网_特色餐饮加盟店_餐饮连锁店加盟 | 广州印刷厂_广州彩印厂-广州艺彩印务有限公司 | 长沙印刷厂-包装印刷-画册印刷厂家-湖南省日大彩色印务有限公司 青州搬家公司电话_青州搬家公司哪家好「鸿喜」青州搬家 | SDG吸附剂,SDG酸气吸附剂,干式酸性气体吸收剂生产厂家,超过20年生产使用经验。 - 富莱尔环保设备公司(原名天津市武清县环保设备厂) | 电子厂招聘_工厂招聘_普工招聘_小时工招聘信息平台-众立方招工网 | 捷码低代码平台 - 3D数字孪生_大数据可视化开发平台「免费体验」 | 锂电叉车,电动叉车_厂家-山东博峻智能科技有限公司 | 微型气象仪_气象传感器_防爆气象传感器-天合传感器大全 | 青岛球场围网,青岛车间隔离网,青岛机器人围栏,青岛水源地围网,青岛围网,青岛隔离栅-青岛晟腾金属制品有限公司 | 暴风影音 | 渗透仪-直剪仪-三轴仪|苏州昱创百科 | 电镀电源整流器_高频电解电源_单脉双脉冲电源 - 东阳市旭东电子科技 | 深圳展厅设计_企业展馆设计_展厅设计公司_数字展厅设计_深圳百艺堂 | 牛皮纸|牛卡纸|进口牛皮纸|食品级牛皮纸|牛皮纸厂家-伽立实业 | 慈溪麦田广告公司,提供慈溪广告设计。 | Akribis直线电机_直线模组_力矩电机_直线电机平台|雅科贝思Akribis-杭州摩森机电科技有限公司 | 陕西安闸机-伸缩门-车牌识别-广告道闸——捷申达门业科技 | 氧化锆陶瓷_氧化锆陶瓷加工_氧化锆陶瓷生产厂家-康柏工业陶瓷有限公司 | 全自动贴标机-套标机-工业热风机-不干胶贴标机-上海厚冉机械 | 高铝轻质保温砖_刚玉莫来石砖厂家_轻质耐火砖价格 | 密集架-密集柜厂家-智能档案密集架-自动选层柜订做-河北风顺金属制品有限公司 | 桌上式超净工作台-水平送风超净工作台-上海康路仪器设备有限公司 | 西安文都考研官网_西安考研辅导班_考研培训机构_西安在职考研培训 | 绿萝净除甲醛|深圳除甲醛公司|测甲醛怎么收费|培训机构|电影院|办公室|车内|室内除甲醛案例|原理|方法|价格立马咨询 | 广州企亚 - 数码直喷、白墨印花、源头厂家、透气无手感方案服务商! | 液压升降平台_剪叉式液压/导轨式升降机_传菜机定做「宁波日腾升降机厂家」 | 铝箔-铝板-花纹铝板-铝型材-铝棒管-上海百亚金属材料有限公司 | 全自动贴标机-套标机-工业热风机-不干胶贴标机-上海厚冉机械 | 哈希余氯测定仪,分光光度计,ph在线监测仪,浊度测定仪,试剂-上海京灿精密机械有限公司 |