国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

AQS同步組件--CyclicBarrier

Null / 1487人閱讀

摘要:也是一個(gè)同步輔助類,它允許一組線程相互等待直到到達(dá)某個(gè)工作屏障點(diǎn),通過他可以完成多線程之間的相互等待。每個(gè)線程都就緒之后才能執(zhí)行后面的操作。是可重用的計(jì)數(shù)器,的使用場(chǎng)景和的使用場(chǎng)景很相似,可以用于多線程計(jì)算數(shù)據(jù)最后總計(jì)結(jié)果。

CyclicBarrier
CyclicBarrier也是一個(gè)同步輔助類,它允許一組線程相互等待直到到達(dá)某個(gè)工作屏障點(diǎn),通過他可以完成多線程之間的相互等待。每個(gè)線程都就緒之后才能執(zhí)行后面的操作。和CountLatch有相似的地方都是通過計(jì)數(shù)器來實(shí)現(xiàn)的。當(dāng)某個(gè)線程執(zhí)行了await()方法后就進(jìn)入等待狀態(tài),計(jì)數(shù)器進(jìn)行加1操作,當(dāng)增加后的值達(dá)到我們?cè)O(shè)定的值后,線程被喚醒,繼續(xù)執(zhí)行后續(xù)操作。CyclicBarrier是可重用的計(jì)數(shù)器,CyclicBarrier的使用場(chǎng)景和CountDownLatch的使用場(chǎng)景很相似,可以用于多線程計(jì)算數(shù)據(jù)最后總計(jì)結(jié)果。

CyclicBarrier和CountDownLatch的使用區(qū)別:

CountDownLatch的計(jì)數(shù)器只能使用一次,CyclicBarrier可以用reset方法重置。

CountDownLatch是一個(gè)線程等待其他線程完成某個(gè)操作后才能繼續(xù)執(zhí)行。也就是一個(gè)或個(gè)多線程等待其他的關(guān)系,而CyclicBarrier是實(shí)現(xiàn)了多個(gè)線程之間的相互等待,所有線程都滿足了條件之后才能繼續(xù)使用。

演示代碼

@Slf4j
public class CyclicBarrierExample1 {

    private static CyclicBarrier barrier = new CyclicBarrier(5);

    public static void main(String[] args) throws Exception {

        ExecutorService executor = Executors.newCachedThreadPool();

        for (int i = 0; i < 10; i++) {
            final int threadNum = i;
            Thread.sleep(1000);
            executor.execute(() -> {
                try {
                    race(threadNum);
                } catch (Exception e) {
                    log.error("exception", e);
                }
            });
        }
        executor.shutdown();
    }

    private static void race(int threadNum) throws Exception {
        Thread.sleep(1000);
        log.info("{} is ready", threadNum);
        barrier.await();
        log.info("{} continue", threadNum);
    }
}

輸出結(jié)果如下:

20:43:46.324 [pool-1-thread-1] INFO com.concurrency.example.aqs.CyclicBarrierExample1 - 0 is ready
20:43:47.322 [pool-1-thread-2] INFO com.concurrency.example.aqs.CyclicBarrierExample1 - 1 is ready
20:43:48.323 [pool-1-thread-3] INFO com.concurrency.example.aqs.CyclicBarrierExample1 - 2 is ready
20:43:49.323 [pool-1-thread-4] INFO com.concurrency.example.aqs.CyclicBarrierExample1 - 3 is ready
20:43:50.325 [pool-1-thread-5] INFO com.concurrency.example.aqs.CyclicBarrierExample1 - 4 is ready
20:43:50.325 [pool-1-thread-5] INFO com.concurrency.example.aqs.CyclicBarrierExample1 - 4 continue
20:43:50.325 [pool-1-thread-1] INFO com.concurrency.example.aqs.CyclicBarrierExample1 - 0 continue
20:43:50.325 [pool-1-thread-2] INFO com.concurrency.example.aqs.CyclicBarrierExample1 - 1 continue
20:43:50.325 [pool-1-thread-4] INFO com.concurrency.example.aqs.CyclicBarrierExample1 - 3 continue
20:43:50.325 [pool-1-thread-3] INFO com.concurrency.example.aqs.CyclicBarrierExample1 - 2 continue
20:43:51.325 [pool-1-thread-6] INFO com.concurrency.example.aqs.CyclicBarrierExample1 - 5 is ready
20:43:52.326 [pool-1-thread-1] INFO com.concurrency.example.aqs.CyclicBarrierExample1 - 6 is ready
20:43:53.326 [pool-1-thread-2] INFO com.concurrency.example.aqs.CyclicBarrierExample1 - 7 is ready
20:43:54.326 [pool-1-thread-4] INFO com.concurrency.example.aqs.CyclicBarrierExample1 - 8 is ready
20:43:55.327 [pool-1-thread-3] INFO com.concurrency.example.aqs.CyclicBarrierExample1 - 9 is ready
20:43:55.327 [pool-1-thread-3] INFO com.concurrency.example.aqs.CyclicBarrierExample1 - 9 continue
20:43:55.327 [pool-1-thread-6] INFO com.concurrency.example.aqs.CyclicBarrierExample1 - 5 continue
20:43:55.327 [pool-1-thread-1] INFO com.concurrency.example.aqs.CyclicBarrierExample1 - 6 continue
20:43:55.327 [pool-1-thread-2] INFO com.concurrency.example.aqs.CyclicBarrierExample1 - 7 continue
20:43:55.327 [pool-1-thread-4] INFO com.concurrency.example.aqs.CyclicBarrierExample1 - 8 continue

我們定義了 private static CyclicBarrier barrier = new CyclicBarrier(5),每次調(diào)用await后加1 知道等于5就一起執(zhí)行接下來的操作。

我們?cè)趧?chuàng)建CyclicBarrier的時(shí)候是可以傳入一段runable的,下面看一下代碼

@Slf4j
public class CyclicBarrierExample3 {

    private static CyclicBarrier barrier = new CyclicBarrier(5, () -> {
        log.info("callback is running");
    });

    public static void main(String[] args) throws Exception {

        ExecutorService executor = Executors.newCachedThreadPool();

        for (int i = 0; i < 10; i++) {
            final int threadNum = i;
            Thread.sleep(1000);
            executor.execute(() -> {
                try {
                    race(threadNum);
                } catch (Exception e) {
                    log.error("exception", e);
                }
            });
        }
        executor.shutdown();
    }

    private static void race(int threadNum) throws Exception {
        Thread.sleep(1000);
        log.info("{} is ready", threadNum);
        barrier.await();
        log.info("{} continue", threadNum);
    }
}

在線程到達(dá)=執(zhí)行屏障時(shí),線程會(huì)優(yōu)先執(zhí)行這個(gè)runable

private static CyclicBarrier barrier = new CyclicBarrier(5, () -> {
        log.info("callback is running");
    });

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/77687.html

相關(guān)文章

  • Java 線程同步組件 CountDownLatch 與 CyclicBarrier 原理分析

    摘要:在創(chuàng)建對(duì)象時(shí),需要轉(zhuǎn)入一個(gè)值,用于初始化的成員變量,該成員變量表示屏障攔截的線程數(shù)。當(dāng)?shù)竭_(dá)屏障的線程數(shù)小于時(shí),這些線程都會(huì)被阻塞住。當(dāng)所有線程到達(dá)屏障后,將會(huì)被更新,表示進(jìn)入新一輪的運(yùn)行輪次中。 1.簡(jiǎn)介 在分析完AbstractQueuedSynchronizer(以下簡(jiǎn)稱 AQS)和ReentrantLock的原理后,本文將分析 java.util.concurrent 包下的兩個(gè)...

    Anonymous1 評(píng)論0 收藏0
  • BATJ都愛問的多線程面試題

    摘要:今天給大家總結(jié)一下,面試中出鏡率很高的幾個(gè)多線程面試題,希望對(duì)大家學(xué)習(xí)和面試都能有所幫助。指令重排在單線程環(huán)境下不會(huì)出先問題,但是在多線程環(huán)境下會(huì)導(dǎo)致一個(gè)線程獲得還沒有初始化的實(shí)例。使用可以禁止的指令重排,保證在多線程環(huán)境下也能正常運(yùn)行。 下面最近發(fā)的一些并發(fā)編程的文章匯總,通過閱讀這些文章大家再看大廠面試中的并發(fā)編程問題就沒有那么頭疼了。今天給大家總結(jié)一下,面試中出鏡率很高的幾個(gè)多線...

    高勝山 評(píng)論0 收藏0
  • AQS同步組件--CountDownLatch

    摘要:當(dāng)計(jì)數(shù)器值到達(dá)時(shí),它表示所有的線程已經(jīng)完成了任務(wù),然后在閉鎖上等待的線程就可以恢復(fù)執(zhí)行任務(wù)。這個(gè)類使用線程在達(dá)到某個(gè)條件后繼續(xù)執(zhí)行的情況。 CountDownLatch CountDownLatch是在java1.5被引入的,跟它一起被引入的并發(fā)工具類還有CyclicBarrier、Semaphore、ConcurrentHashMap和BlockingQueue,它們都存在于java...

    jackzou 評(píng)論0 收藏0
  • 長(zhǎng)文慎入-探索Java并發(fā)編程與高并發(fā)解決方案

    摘要:所有示例代碼請(qǐng)見下載于基本概念并發(fā)同時(shí)擁有兩個(gè)或者多個(gè)線程,如果程序在單核處理器上運(yùn)行多個(gè)線程將交替地?fù)Q入或者換出內(nèi)存這些線程是同時(shí)存在的,每個(gè)線程都處于執(zhí)行過程中的某個(gè)狀態(tài),如果運(yùn)行在多核處理器上此時(shí),程序中的每個(gè)線程都 所有示例代碼,請(qǐng)見/下載于 https://github.com/Wasabi1234... showImg(https://upload-images.jians...

    SimpleTriangle 評(píng)論0 收藏0
  • Java線程入門第三篇

    摘要:類大家都叫他讀寫鎖,他可以聽時(shí)刻允許多線程進(jìn)入,讀寫鎖比排它鎖性能好,因?yàn)榇蠖鄶?shù)情況讀多于寫。和區(qū)別同步屏障,用于多線程計(jì)算結(jié)果最后合并場(chǎng)景。 Java內(nèi)存模型(jmm) Why:保證多線程正確協(xié)同工作 看圖說明:showImg(https://segmentfault.com/img/remote/1460000017767400); 文字解釋:線程a和線程b通信過程,首先線程...

    Lucky_Boy 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<