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

什么是 Java 的 CyclicBarrier(代碼示例)

 更新時(shí)間:2025年03月14日 15:16:28   作者:一只蜘豬  
CyclicBarrier 是多線(xiàn)程協(xié)同的利器,適合需要多次同步的場(chǎng)景,本文通過(guò)代碼示例講解什么是 Java 的 CyclicBarrier,感興趣的朋友一起看看吧

你的回答(口語(yǔ)化,面試場(chǎng)景)
面試官:什么是 Java 的 CyclicBarrier
你:
好的,我來(lái)舉個(gè)例子說(shuō)明。比如一個(gè)游戲需要5個(gè)玩家全部準(zhǔn)備就緒才能開(kāi)始,這時(shí)候可以用 CyclicBarrier。

核心作用
CyclicBarrier 讓一組線(xiàn)程互相等待,直到所有線(xiàn)程都到達(dá)屏障點(diǎn)(Barrier),再一起繼續(xù)執(zhí)行。它像一道關(guān)卡,必須等所有線(xiàn)程到齊才能放行。

核心特性

  • 可重復(fù)使用:所有線(xiàn)程通過(guò)屏障后,CyclicBarrier 會(huì)自動(dòng)重置(比如玩家結(jié)束一局后,可以開(kāi)始下一局)。
  • 支持回調(diào):可以設(shè)置一個(gè)回調(diào)任務(wù)(Runnable),在所有線(xiàn)程到達(dá)屏障后觸發(fā)(比如發(fā)游戲開(kāi)始的廣播)。
  • 使用場(chǎng)景
  • 分階段任務(wù):多線(xiàn)程分批次處理數(shù)據(jù),等待所有線(xiàn)程完成第一階段后,再統(tǒng)一進(jìn)入第二階段。
  • 壓測(cè)模擬:模擬1000個(gè)用戶(hù)同時(shí)發(fā)起請(qǐng)求(等所有線(xiàn)程就緒后同時(shí)觸發(fā))。
  • 分布式協(xié)同:多個(gè)微服務(wù)節(jié)點(diǎn)完成初始化后,同時(shí)對(duì)外提供服務(wù)。

代碼示例

// 3個(gè)線(xiàn)程互相等待,全部到達(dá)后執(zhí)行回調(diào)  
CyclicBarrier barrier = new CyclicBarrier(3, () -> {  
    System.out.println("所有玩家已就位,游戲開(kāi)始!");  
});  
// 玩家線(xiàn)程  
executor.submit(() -> {  
    System.out.println("玩家A準(zhǔn)備完成");  
    barrier.await();  // 等待其他玩家  
    System.out.println("玩家A開(kāi)始游戲");  
});  
// 類(lèi)似地提交玩家B、C的線(xiàn)程  

對(duì)比 CountDownLatch

  • 重置能力:CyclicBarrier 可重復(fù)用,CountDownLatch 只能一次性。
  • 觸發(fā)角色:CyclicBarrier 是線(xiàn)程互相等待,CountDownLatch 是主線(xiàn)程等待子線(xiàn)程。

預(yù)測(cè)面試官可能的追問(wèn)及回答
追問(wèn)1:如果某個(gè)線(xiàn)程在 await() 時(shí)被中斷了,會(huì)發(fā)生什么?
回答:

  • 被中斷的線(xiàn)程會(huì)拋出 InterruptedException,同時(shí)其他等待的線(xiàn)程會(huì)收到 BrokenBarrierException,屏障會(huì)失效。
  • 需要調(diào)用 reset() 重置屏障后才能繼續(xù)使用。

追問(wèn)2:CyclicBarrier 底層是如何實(shí)現(xiàn)的?
回答:

  • 基于 ReentrantLock 和 Condition。
    • 內(nèi)部維護(hù)一個(gè)計(jì)數(shù)器,線(xiàn)程調(diào)用 await() 時(shí)計(jì)數(shù)器減1。
    • 當(dāng)計(jì)數(shù)器歸零時(shí),觸發(fā)回調(diào)任務(wù),并喚醒所有等待線(xiàn)程。

知識(shí)框架與底層原理補(bǔ)充

核心機(jī)制
| 組件 | 作用 |
|---------------------|-------------------------------------------------------------------------|
| 屏障點(diǎn)(Barrier) | 線(xiàn)程必須等待其他線(xiàn)程到達(dá)的位置。 |
| Generation | 記錄當(dāng)前屏障的狀態(tài)(是否已破壞),支持重置后復(fù)用。 |
| 回調(diào)任務(wù) | 可選的 Runnable,由最后一個(gè)到達(dá)屏障的線(xiàn)程執(zhí)行。 |

源碼級(jí)實(shí)現(xiàn)邏輯

初始化:設(shè)置參與線(xiàn)程數(shù)(parties)和回調(diào)任務(wù)。

await() 流程:

  • 獲取鎖(ReentrantLock),檢查屏障是否已破壞(Broken)。
  • 減少剩余計(jì)數(shù)(count),若 count == 0,執(zhí)行回調(diào)并喚醒所有線(xiàn)程。
  • 若未歸零,線(xiàn)程通過(guò) Condition.await() 進(jìn)入等待隊(duì)列。

使用注意事項(xiàng)

  • 獲取鎖(ReentrantLock),檢查屏障是否已破壞(Broken)。
  • 減少剩余計(jì)數(shù)(count),若 count == 0,執(zhí)行回調(diào)并喚醒所有線(xiàn)程。
  • 若未歸零,線(xiàn)程通過(guò) Condition.await() 進(jìn)入等待隊(duì)列。

實(shí)戰(zhàn)案例

  • 場(chǎng)景:電商大促時(shí),統(tǒng)計(jì)各區(qū)域銷(xiāo)量并匯總。
  • 方案:

創(chuàng)建 CyclicBarrier,線(xiàn)程數(shù)與區(qū)域數(shù)相同。

每個(gè)線(xiàn)程計(jì)算一個(gè)區(qū)域的銷(xiāo)量,完成后調(diào)用 await()。

所有線(xiàn)程到達(dá)后,觸發(fā)回調(diào)任務(wù)匯總總銷(xiāo)量。

CyclicBarrier barrier = new CyclicBarrier(4, () -> {  
    System.out.println("全部區(qū)域銷(xiāo)量計(jì)算完成,總銷(xiāo)量:" + total);  
});  
// 4個(gè)區(qū)域計(jì)算線(xiàn)程  
for (int i = 0; i < 4; i++) {  
    executor.submit(() -> {  
        calculateRegionSales();  
        barrier.await();  
    });  
}  

總結(jié)

  • CyclicBarrier 是多線(xiàn)程協(xié)同的利器,適合需要多次同步的場(chǎng)景(如分階段任務(wù))。
  • 理解底層鎖機(jī)制和異常處理,避免因線(xiàn)程中斷導(dǎo)致屏障失效。
  • 優(yōu)先于 CountDownLatch 的場(chǎng)景:需重復(fù)觸發(fā)同步點(diǎn),或需要回調(diào)任務(wù)統(tǒng)一處理結(jié)果。

到此這篇關(guān)于什么是 Java 的 CyclicBarrier的文章就介紹到這了,更多相關(guān)Java 的 CyclicBarrier內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java利用字符流輕松處理文本數(shù)據(jù)

    Java利用字符流輕松處理文本數(shù)據(jù)

    在Java中,文本數(shù)據(jù)是經(jīng)常處理的一種數(shù)據(jù)類(lèi)型,而字符流就是用來(lái)處理文本數(shù)據(jù)的一種流,下面就為大家介紹一下Java字符流的基本概念、常用類(lèi)和方法,以及如何使用字符流來(lái)讀寫(xiě)文件吧
    2023-09-09
  • MyBatis的一級(jí)緩存和二級(jí)緩存以及優(yōu)點(diǎn)說(shuō)明

    MyBatis的一級(jí)緩存和二級(jí)緩存以及優(yōu)點(diǎn)說(shuō)明

    MyBatis的緩存機(jī)制包括一級(jí)緩存和二級(jí)緩存,一級(jí)緩存是SqlSession級(jí)別的緩存,開(kāi)啟默認(rèn),二級(jí)緩存是跨SqlSession的緩存,需要手動(dòng)開(kāi)啟和配置,二級(jí)緩存的優(yōu)點(diǎn)是減少數(shù)據(jù)庫(kù)訪問(wèn)、提高性能、降低負(fù)載和提高可擴(kuò)展性,同時(shí)需要注意緩存可能導(dǎo)致的數(shù)據(jù)不一致問(wèn)題
    2025-02-02
  • 基于Springboot+Vue實(shí)現(xiàn)的在線(xiàn)答題闖關(guān)系統(tǒng)全過(guò)程

    基于Springboot+Vue實(shí)現(xiàn)的在線(xiàn)答題闖關(guān)系統(tǒng)全過(guò)程

    這篇文章主要介紹了基于Springboot+Vue實(shí)現(xiàn)的在線(xiàn)答題闖關(guān)系統(tǒng)的相關(guān)資料,文中包括前端Vue.js、后端SpringBoot及MySQL數(shù)據(jù)庫(kù)的使用,系統(tǒng)功能涵蓋順序出題、體型練習(xí)、隨機(jī)出題、錯(cuò)題本、收藏題和答題統(tǒng)計(jì)等,需要的朋友可以參考下
    2024-12-12
  • java使用泛型實(shí)現(xiàn)棧結(jié)構(gòu)示例分享

    java使用泛型實(shí)現(xiàn)棧結(jié)構(gòu)示例分享

    泛型是Java SE5.0的重要特性,使用泛型編程可以使代碼獲得最大的重用。由于在使用泛型時(shí)要指明泛型的具體類(lèi)型,這樣就避免了類(lèi)型轉(zhuǎn)換。本實(shí)例將使用泛型來(lái)實(shí)現(xiàn)一個(gè)棧結(jié)構(gòu),并對(duì)其進(jìn)行測(cè)試
    2014-03-03
  • java占位符替換五種方式小結(jié)

    java占位符替換五種方式小結(jié)

    我們經(jīng)常會(huì)遇到需要替換字符串中的占位符的情況,本文主要介紹了java占位符替換五種方式小結(jié),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2024-06-06
  • 詳解Java中List的正確的刪除方法

    詳解Java中List的正確的刪除方法

    這篇文章主要為大家詳細(xì)介紹了Java中List的正確的刪除方法,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)有一定幫助,需要的可以參考一下
    2022-05-05
  • Spring Security實(shí)現(xiàn)5次密碼錯(cuò)誤觸發(fā)賬號(hào)自動(dòng)鎖定功能

    Spring Security實(shí)現(xiàn)5次密碼錯(cuò)誤觸發(fā)賬號(hào)自動(dòng)鎖定功能

    在現(xiàn)代互聯(lián)網(wǎng)應(yīng)用中,賬號(hào)安全是重中之重,然而,暴力 破解攻擊依然是最常見(jiàn)的安全威脅之一,攻擊者通過(guò)自動(dòng)化腳本嘗試大量的用戶(hù)名和密碼組合,試圖找到漏洞進(jìn)入系統(tǒng),所以為了解決這一問(wèn)題,賬號(hào)鎖定機(jī)制被廣泛應(yīng)用,本文介紹了Spring Security實(shí)現(xiàn)5次密碼錯(cuò)誤觸發(fā)賬號(hào)鎖定功能
    2024-12-12
  • Java實(shí)現(xiàn)學(xué)生信息管理界面

    Java實(shí)現(xiàn)學(xué)生信息管理界面

    這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)學(xué)生信息管理界面,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-06-06
  • springBoot如何動(dòng)態(tài)加載資源文件

    springBoot如何動(dòng)態(tài)加載資源文件

    這篇文章主要介紹了springBoot如何動(dòng)態(tài)加載資源文件,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • 基于maven使用IDEA創(chuàng)建多模塊項(xiàng)目

    基于maven使用IDEA創(chuàng)建多模塊項(xiàng)目

    這篇文章主要介紹了基于maven使用IDEA創(chuàng)建多模塊項(xiàng)目,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-04-04

最新評(píng)論