日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

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

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

瀏覽:29日期: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
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
日本va欧美va瓶| 亚洲黄色中文字幕| 精品一区欧美| 亚洲深夜视频| 国产精品精品| 天堂av在线| 一区二区精品伦理...| 成人午夜网址| 精品国产一区二区三区性色av| 欧美亚洲tv| 欧美片第1页综合| 国产日韩欧美一区二区三区在线观看| 亚洲精品小说| 黄色亚洲大片免费在线观看| 一区三区视频| 亚洲伊人精品酒店| 亚洲精品欧美| 青青国产精品| 免费一级欧美在线观看视频| 国产精品自在| 麻豆精品99| 精品日产乱码久久久久久仙踪林| 精品一区二区三区四区五区| 98精品久久久久久久| 激情亚洲影院在线观看| 蜜桃成人av| 免费成人在线影院| 蜜桃久久久久久久| 日韩精品欧美大片| 久久爱www成人| av免费不卡国产观看| 精品在线播放| 中文字幕av一区二区三区人| 日本a级不卡| 你懂的国产精品| 神马久久午夜| 99国产精品99久久久久久粉嫩| 蜜桃一区二区三区在线| 日本免费一区二区视频| 美腿丝袜在线亚洲一区| 日本欧美国产| 欧美91福利在线观看| 欧美高清一区| 日韩精品久久久久久| 精品一区二区三区视频在线播放| 久久久91麻豆精品国产一区| 欧美日韩视频网站| 水蜜桃久久夜色精品一区的特点| 亚洲久草在线| 欧美视频二区| 国产一区国产二区国产三区| 91精品成人| 日韩一区精品| 精品国产99| 怡红院精品视频在线观看极品| 日韩区欧美区| 亚洲天堂免费电影| 影视先锋久久| 91欧美极品| 日韩另类视频| 国产欧美日韩精品一区二区免费| 日韩免费福利视频| 蜜臀久久99精品久久久久宅男| 日韩成人精品一区二区三区 | 你懂的国产精品| 成人羞羞在线观看网站| 玖玖玖国产精品| 波多视频一区| 亚洲小说春色综合另类电影| 久久亚洲人体| 丝袜国产日韩另类美女| 成人亚洲一区| 欧美日韩va| 九一国产精品| 免费亚洲婷婷| 蜜臀久久99精品久久久画质超高清 | 久久精品观看| 亚洲精品乱码日韩| 99久久九九| 国产成人精品亚洲线观看| 日韩精品五月天| 美女黄网久久| 精品一区欧美| caoporn视频在线| 欧美亚洲福利| 美女国产精品| 激情六月综合| а√天堂8资源中文在线| 欧美日韩一区二区三区四区在线观看 | 国产精品成人a在线观看| 日韩亚洲精品在线观看| 黄色不卡一区| 国产v综合v| 免费在线观看一区| 欧美精品三级在线| 日韩一区精品视频| 麻豆一区二区在线| 国产亚洲字幕| 日本中文字幕不卡| 日韩欧美自拍| 日韩福利视频网| 三级在线观看一区二区| 成年男女免费视频网站不卡| 久久国际精品| 亚洲在线观看| 欧美日韩四区| 日韩大片在线播放| 精品在线网站观看| 亚洲精品少妇| 亚洲影院天堂中文av色| 婷婷成人综合| 久久精品影视| 久久精品国产99国产| 日韩在线麻豆| 欧美日韩四区| 精品久久久久中文字幕小说| 欧美精品中文| 亚洲伊人精品酒店| 视频一区视频二区中文| 欧美性感美女一区二区| 久久影视一区| 捆绑调教日本一区二区三区| 国产伦久视频在线观看| 国产精品va视频| 国产黄色精品| 欧美一区免费| 国产精品视频一区二区三区四蜜臂| 日韩一区二区久久| 日韩在线a电影| 99在线|亚洲一区二区| 999国产精品999久久久久久| 久久精品国产福利| 欧美丰满日韩| 精品资源在线| 国产66精品| 老鸭窝一区二区久久精品| 里番精品3d一二三区| 国产日韩一区| 精品久久视频| 国产成人免费| 四虎4545www国产精品 | 日本不卡视频在线观看| 综合激情视频| 尤物tv在线精品| 亚洲精品99| 91精品推荐| 欧美+日本+国产+在线a∨观看| 亚洲无线一线二线三线区别av| 四虎4545www国产精品 | 婷婷综合激情| 99久久久久| 中文国产一区| 欧美日韩激情| 蜜臀久久久久久久| 亚洲精品乱码久久久久久蜜桃麻豆| 日韩一区二区三区免费视频| 日韩欧美四区| 国产suv精品一区二区四区视频| 成人台湾亚洲精品一区二区| 999国产精品永久免费视频app| 亚洲成人精品| 亚洲69av| 日本欧美久久久久免费播放网| 日韩高清欧美激情| 国产福利一区二区精品秒拍| 国产欧美一区二区三区精品酒店| 激情国产在线| 丝袜美腿亚洲一区二区图片| 亚洲另类黄色| 精品视频在线一区二区在线| 91亚洲国产| 久久国产精品毛片| 日韩av一区二区三区四区| 久久男人天堂| 精品日韩毛片| 欧美亚洲免费| 国产a亚洲精品| 免费日韩av片| 玖玖玖国产精品| 麻豆成人在线观看| 91综合网人人| 男人操女人的视频在线观看欧美| 蜜臀91精品一区二区三区| 日韩精品福利一区二区三区| 国产毛片精品久久| 国产一区二区三区四区五区传媒| www.九色在线| 午夜国产一区二区| 亚洲日产国产精品| 91精品韩国| 综合一区在线| 久久美女性网| 爽爽淫人综合网网站| 国产亚洲精品精品国产亚洲综合 | 日韩精品一区二区三区中文在线 | 欧美成a人片免费观看久久五月天| 国产精选在线| 日韩不卡手机在线v区| 国精品产品一区| 午夜视频一区二区在线观看|