欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

CyclicBarrier線程同步共享變量底層原理示例解析

 更新時間:2023年07月14日 10:01:43   作者:今夜有點兒涼  
這篇文章主要為大家介紹了CyclicBarrier線程同步共享變量底層原理示例解析詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

引言

CyclicBarrier是Java.util.concurrent包中提供的另一個同步工具類,它允許一組線程在某個共同點處相互等待,并在所有線程都達到某個條件時繼續(xù)執(zhí)行。

CyclicBarrier的代碼示例

import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;
public class CyclicBarrierExample {
    public static void main(String[] args) {
        int workerCount = 3;
        Runnable barrierAction = () -> System.out.println("All workers have reached the barrier.");
        CyclicBarrier cyclicBarrier = new CyclicBarrier(workerCount, barrierAction);
        for (int i = 0; i < workerCount; i++) {
            Thread worker = new Thread(new Worker(cyclicBarrier));
            worker.start();
        }
    }
    static class Worker implements Runnable {
        private final CyclicBarrier cyclicBarrier;
        public Worker(CyclicBarrier cyclicBarrier) {
            this.cyclicBarrier = cyclicBarrier;
        }
        @Override
        public void run() {
            try {
                // 模擬工作任務(wù)的執(zhí)行
                Thread.sleep(2000);
                System.out.println("Worker " + Thread.currentThread().getId() + " has reached the barrier.");
                cyclicBarrier.await(); // 工作線程到達屏障,等待其他線程
                System.out.println("Worker " + Thread.currentThread().getId() + " continues its work.");
            } catch (InterruptedException | BrokenBarrierException e) {
                e.printStackTrace();
            }
        }
    }
}

打印結(jié)果:

Worker 13 has reached the barrier.
Worker 14 has reached the barrier.
Worker 12 has reached the barrier.
All workers have reached the barrier.
Worker 14 continues its work.
Worker 13 continues its work.
Worker 12 continues its work.

首先,創(chuàng)建了一個CyclicBarrier對象cyclicBarrier,并指定workerCount為3(代表需要等待的線程數(shù)),并設(shè)置barrierAction為一個Runnable,用于在所有線程到達屏障時執(zhí)行。

然后,使用一個for循環(huán)創(chuàng)建了3個工作線程(Worker),每個工作線程在完成一部分任務(wù)后都會調(diào)用await()方法來等待其他線程。在工作線程內(nèi)部,它們會先模擬一段工作任務(wù)的執(zhí)行,然后調(diào)用cyclicBarrier.await()方法等待其他線程。

當所有的工作線程都到達屏障時,即達到指定的workerCount時,它們就會繼續(xù)執(zhí)行后續(xù)的任務(wù)。CyclicBarrier會自動重置計數(shù)器,可以繼續(xù)使用。

在示例中,為了模擬工作任務(wù)的執(zhí)行,工作線程通過Thread.sleep(2000)來暫停2秒鐘。然后,每個工作線程輸出自己到達屏障的信息,等待其他線程。當所有線程都到達屏障時,會執(zhí)行設(shè)置的barrierAction,即輸出所有工作線程都到達了屏障。在此之后,工作線程會繼續(xù)執(zhí)行后續(xù)的工作任務(wù)。

小結(jié):

CyclicBarrier可以用于在多個線程中實現(xiàn)同步,當所有線程都到達屏障時,才能繼續(xù)執(zhí)行后續(xù)的任務(wù)。它常用于需要等待所有線程完成一定階段的任務(wù)后再進行下一階段的場景。

使用CyclicBarrier示例 模擬收集龍珠的場景

當收集到7顆龍珠后,會觸發(fā)一個動作(召喚神龍)。

import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;
public class CyclicBarrierDemo {
    public static void main(String[] args) {
        CyclicBarrier cyclicBarrier = new CyclicBarrier(7, () -> {
            System.out.println("召喚神龍");
        });
        for (int i = 1; i <= 7; i++) {
            final int temp = i;
            new Thread(() -> {
                System.out.println(Thread.currentThread().getName() + "\t 收集到第" + temp + "顆龍珠");
                try {
                    cyclicBarrier.await();
                } catch (InterruptedException | BrokenBarrierException e) {
                    e.printStackTrace();
                }
            }, String.valueOf(i)).start();
        }
    }
}

在這個示例中,我們創(chuàng)建了一個 CyclicBarrier 對象,指定計數(shù)器的值為 7,當 7 個線程都調(diào)用了 await() 方法后,會觸發(fā)傳入的 Runnable 對象,即召喚神龍的動作。

在 for 循環(huán)中,我們創(chuàng)建了 7 個線程,并分別模擬收集到不同的龍珠。每個線程執(zhí)行完收集龍珠的操作后,調(diào)用 cyclicBarrier.await() 方法,等待其他線程。

當所有線程都調(diào)用了 await() 方法后,CyclicBarrier 中的計數(shù)器會達到設(shè)定的值,觸發(fā)召喚神龍的動作。輸出結(jié)果可能類似于以下內(nèi)容:

1     收集到第1顆龍珠
2     收集到第2顆龍珠
3     收集到第3顆龍珠
4     收集到第4顆龍珠
5     收集到第5顆龍珠
6     收集到第6顆龍珠
7     收集到第7顆龍珠
召喚神龍

這個示例展示了如何使用 CyclicBarrier 來等待多個工作線程執(zhí)行完畢,并在所有線程完成后觸發(fā)一個動作。

CyclicBarrier 底層原理

CyclicBarrier 的底層原理涉及到線程同步和共享變量的操作。

CyclicBarrier 的底層原理是基于 AQS(AbstractQueuedSynchronizer)實現(xiàn)的。 CyclicBarrier 內(nèi)部維護了一個共享的同步狀態(tài)(state)和一個等待隊列。每個線程在調(diào)用 await() 方法時,會將線程加入等待隊列,并檢查當前狀態(tài)是否為初始狀態(tài)。如果是初始狀態(tài),則線程會進入休眠狀態(tài),等待其他線程的到達。當所有線程都調(diào)用 await() 方法后,它們會相互喚醒,繼續(xù)執(zhí)行后續(xù)的任務(wù)。同時,CyclicBarrier 的狀態(tài)會被重置為初始狀態(tài),可以繼續(xù)使用。這樣就實現(xiàn)了線程之間的協(xié)調(diào)與等待的功能。

在 CyclicBarrier 中,有一個計數(shù)器(count)和一個屏障點(barrier)用于實現(xiàn)線程的同步。計數(shù)器的初始值由構(gòu)造函數(shù)傳入,每當一個線程調(diào)用 await() 方法時,計數(shù)器的值會減一。當計數(shù)器的值變?yōu)榱銜r,表示所有線程都已到達屏障點,可以繼續(xù)執(zhí)行后續(xù)操作。

CyclicBarrier 使用了共享變量和內(nèi)置的線程同步機制來實現(xiàn)等待和通知的功能。具體來說,它使用了以下幾個關(guān)鍵的方法和數(shù)據(jù)結(jié)構(gòu):

  • await():線程調(diào)用 await() 方法時,會嘗試獲取內(nèi)置的鎖,然后將計數(shù)器的值減一。如果計數(shù)器的值不為零,那么線程會被阻塞,等待其他線程到達屏障。如果計數(shù)器的值變?yōu)榱?,那么所有在屏障上等待的線程將會被喚醒,可以繼續(xù)執(zhí)行后續(xù)操作。
  • 內(nèi)置的同步機制:CyclicBarrier 內(nèi)部使用了內(nèi)置的同步機制,如鎖、條件變量等,來實現(xiàn)線程的等待和通知機制。
  • 循環(huán)使用的特性:與 CountDownLatch 不同,CyclicBarrier 是可以循環(huán)使用的。當所有線程都到達屏障后,計數(shù)器會被重置為初始值,可以進行下一輪的等待和通知。

在底層實現(xiàn)中,CyclicBarrier 使用了類似于 ReentrantLock 和 Condition 的機制來實現(xiàn)線程的等待和喚醒。當一個線程調(diào)用 await() 方法時,它會嘗試獲取內(nèi)置的鎖,然后檢查計數(shù)器的值。如果計數(shù)器的值不為零,線程會通過條件變量進入等待狀態(tài)。當計數(shù)器的值變?yōu)榱銜r,最后一個到達屏障的線程會通過條件變量喚醒其他等待的線程,使它們繼續(xù)執(zhí)行。

需要注意的是,CyclicBarrier 是可重入的,即同一個線程可以多次調(diào)用 await() 方法等待其他線程到達屏障。只有當所有線程都調(diào)用了 await() 方法,計數(shù)器的值才會變?yōu)榱?,觸發(fā)屏障的打開。

總結(jié)

CyclicBarrier 的底層原理是通過共享變量和內(nèi)置的線程同步機制來實現(xiàn)線程的等待和通知。它提供了一種循環(huán)使用的屏障機制,可以在某個屏障點上同步等待,然后同時繼續(xù)執(zhí)行后續(xù)的任務(wù)。

以上就是CyclicBarrier線程同步共享變量底層原理示例解析的詳細內(nèi)容,更多關(guān)于CyclicBarrier線程同步共享變量的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • SpringBoot多環(huán)境開發(fā)與日志小結(jié)

    SpringBoot多環(huán)境開發(fā)與日志小結(jié)

    這篇文章主要介紹了SpringBoot多環(huán)境開發(fā)與日志,下面給大家說一下如何基于多環(huán)境開發(fā)做配置獨立管理,務(wù)必掌握,需要的朋友可以參考下
    2022-08-08
  • Java單鏈表基本操作的實現(xiàn)

    Java單鏈表基本操作的實現(xiàn)

    鏈表是一種數(shù)據(jù)結(jié)構(gòu),和數(shù)組同級。接下來通過本文給大家介紹Java單鏈表基本操作的實現(xiàn),非常不錯,具有參考借鑒價值,感興趣的朋友一起看下吧
    2016-07-07
  • Java事件機制要素及實例詳解

    Java事件機制要素及實例詳解

    這篇文章主要介紹了Java事件機制要素及實例詳解,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-04-04
  • Java數(shù)據(jù)脫敏實現(xiàn)的方法總結(jié)

    Java數(shù)據(jù)脫敏實現(xiàn)的方法總結(jié)

    數(shù)據(jù)脫敏,指的是對某些敏感信息通過脫敏規(guī)則進行數(shù)據(jù)的變形,實現(xiàn)敏感隱私數(shù)據(jù)的可靠保護,本文主要是對后端數(shù)據(jù)脫敏實現(xiàn)的簡單總結(jié),希望對大家有所幫助
    2023-07-07
  • IDEA 的基本介紹使用及斷點調(diào)試技巧

    IDEA 的基本介紹使用及斷點調(diào)試技巧

    IDEA 是 JetBrains 公司的產(chǎn)品,總部位于捷克的首都布拉格,IDEA在業(yè)界被公認為最好的 Java 開發(fā)工具,今天通過本文給大家介紹IDEA 的基本介紹使用及斷點調(diào)試技巧,感興趣的朋友跟隨小編一起看看吧
    2021-11-11
  • Spring Boot Actuator端點相關(guān)原理解析

    Spring Boot Actuator端點相關(guān)原理解析

    這篇文章主要介紹了Spring Boot Actuator端點相關(guān)原理解析,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-07-07
  • 解決SpringBoot運行報錯:找不到或無法加載主類的問題

    解決SpringBoot運行報錯:找不到或無法加載主類的問題

    這篇文章主要介紹了解決SpringBoot運行報錯:找不到或無法加載主類的問題,具有很好的參考價值,對大家的學(xué)習(xí)或工作有一定的參考價值,需要的朋友可以參考下
    2023-09-09
  • Java日常練習(xí)題,每天進步一點點(64)

    Java日常練習(xí)題,每天進步一點點(64)

    下面小編就為大家?guī)硪黄狫ava基礎(chǔ)的幾道練習(xí)題(分享)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧,希望可以幫到你
    2021-09-09
  • springboot+mybatis配置clickhouse實現(xiàn)插入查詢功能

    springboot+mybatis配置clickhouse實現(xiàn)插入查詢功能

    這篇文章主要介紹了springboot+mybatis配置clickhouse實現(xiàn)插入查詢功能,本文通過實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-08-08
  • springmvc使用@notNull注解驗證請求參數(shù)方式

    springmvc使用@notNull注解驗證請求參數(shù)方式

    這篇文章主要介紹了springmvc使用@notNull注解驗證請求參數(shù)方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教<BR>
    2024-01-01

最新評論