最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java中的CyclicBarrier、CountDownLatch和Semaphore的具體使用

 更新時間:2024年05月28日 08:34:03   作者:逆流的小魚168  
本文主要介紹了Java中的CyclicBarrier、CountDownLatch和Semaphore的具體使用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

1.CountDownLatch

1.1 介紹和用途

CountDownLatch 是一個同步助手類,在完成一組正在其他線程中執(zhí)行的操作之前,它允許一個或多個線程一直等待。

1.2 工作原理

它通過一個計數(shù)器來實現(xiàn),我們初始化 CountDownLatch 對象時指定計數(shù)器的值,每當一個指定的操作執(zhí)行完成后,計數(shù)值就減一。當計數(shù)值達到零時,它表示所有需要等待的操作都完成了,此時阻塞在 CountDownLatch 上的線程就可以恢復執(zhí)行任務。

1.3 使用場景和示例代碼

CountDownLatch 經(jīng)常用于確保某些操作在繼續(xù)執(zhí)行應用程序剩余部分之前完成,例如,服務器的服務依賴在接受請求前必須初始化完成。

import java.util.concurrent.CountDownLatch;
public class ServiceLoader {
    // 初始計數(shù)器為3,表示需要等待3個服務加載
    private static final CountDownLatch latch = new CountDownLatch(3);
    public static void main(String[] args) throws InterruptedException {
        // 啟動服務加載線程
        new Thread(new Service("Service 1", latch)).start();
        new Thread(new Service("Service 2", latch)).start();
        new Thread(new Service("Service 3", latch)).start();
        // 主線程等待服務加載完成
        latch.await();
        System.out.println("所有服務已加載完成,服務可以開始接收請求...");
    }
    static class Service implements Runnable {
        private final String name;
        private final CountDownLatch latch;
        public Service(String name, CountDownLatch latch) {
            this.name = name;
            this.latch = latch;
        }
        @Override
        public void run() {
            try {
                // 模擬服務加載耗時操作
                Thread.sleep((long) (Math.random() * 1000));
                System.out.println(name + " 服務加載完成.");
                // 服務加載完成后,計數(shù)器減一
                latch.countDown();
            } catch (InterruptedException e) {
                Thread.currentThread().interrupt();
            }
        }
    }
}

1.4 注意事項和最佳實踐

CountDownLatch 的計數(shù)器無法被重置,如果需要一個能夠重置計數(shù)的版本,可以考慮使用 CyclicBarrier。在使用時還需注意異常處理,避免由于異常造成的線程永遠等待的情況。

2.CyclicBarrier

2.1 介紹和用途

CyclicBarrier 是一個同步助手類,它允許一組線程互相等待,直到所有線程都到達一個公共的屏障點(Barrier Point)后才繼續(xù)執(zhí)行。

2.2 工作原理

CyclicBarrier 通過內(nèi)部計數(shù)器來跟蹤到達屏障點的線程數(shù)。當線程到達屏障點時,它調(diào)用 await() 方法,并阻塞直到指定數(shù)量的線程都到達了屏障點。此時,屏障打開,所有阻塞的線程將繼續(xù)執(zhí)行。不同于 CountDownLatch,CyclicBarrier 是可重用的。

2.3 使用場景和示例代碼

CyclicBarrier 常用于多線程計算數(shù)據(jù)的場景,需要等到全部線程完成計算,才能進行下一步的處理。

import java.util.concurrent.CyclicBarrier;
import java.util.concurrent.BrokenBarrierException;
public class DataProcessor {
    private static final int NUMBER_OF_THREADS = 3;
    private static CyclicBarrier barrier = new CyclicBarrier(NUMBER_OF_THREADS, 
        new Runnable() {
            @Override
            public void run() {
                // 當所有線程到達屏障點時執(zhí)行
                System.out.println("所有計算完成,進行數(shù)據(jù)合并...");
            }
        });
    public static void main(String[] args) {
        for(int i = 0; i < NUMBER_OF_THREADS; i++) {
            new Thread(new Worker(i)).start();
        }
    }
    static class Worker implements Runnable {
        private int id;
        public Worker(int id) {
            this.id = id;
        }
        @Override
        public void run() {
            try {
                // 模擬數(shù)據(jù)處理
                System.out.println("線程 #" + id + " 正在處理數(shù)據(jù)...");
                Thread.sleep((long) (Math.random() * 1000));
                System.out.println("線程 #" + id + " 數(shù)據(jù)處理完成,等待其他線程...");
                // 等待其他線程都執(zhí)行到這個點
                barrier.await();
                System.out.println("線程 #" + id + " 繼續(xù)后續(xù)操作...");
            } catch (InterruptedException | BrokenBarrierException e) {
                e.printStackTrace();
            }
        }
    }
}

2.4 與CountDownLatch的比較

與 CountDownLatch 相比,CyclicBarrier 可以在所有等待線程都被釋放后重置計數(shù)器,而 CountDownLatch 不能重置。

2.5 注意事項和最佳實踐

使用 CyclicBarrier 時需要注意,如果任何線程在等待過程中因為中斷或者超時而提前離開屏障點, 或者等待線程的數(shù)目永遠不足以達到屏障點,這將導致所有在屏障點等待的線程拋出 BrokenBarrierException。因此,在使用時需要妥善處理這些可能的異常場景。
為了避免這種情形,可以在 await 方法中設置一個超時時間,并適當處理 TimeoutException。同時,可以通過 isBroken 方法檢查屏障點的狀態(tài),以便在必要時對線程進行重新安排或者重置屏障點。
除此之外,設計上建議只在所有參與線程要完成的任務確實需要互相等待時才使用 CyclicBarrier,在任務獨立的情況下使用 CountDownLatch 會更為合適。

3.Semaphore

3.1 介紹和用途

Semaphore(信號量)是一種基于計數(shù)的同步機制,它可以用來控制同時訪問特定資源的線程數(shù)量,是實現(xiàn)資源池或者限制容量的一個有力工具。

3.2 工作原理

Semaphore 管理一組許可證(permits),線程可以通過 acquire() 方法獲取許可證,如果 Semaphore 內(nèi)部計數(shù)為零,表示沒有許可證可用,線程將會阻塞直到有許可證被釋放。相反,線程完成任務后,可以通過 release() 方法釋放許可證,并將其返回給信號量。

3.3 使用場景和示例代碼

Semaphore 通常用于對資源池進行控制,比如數(shù)據(jù)庫連接池,限制同時訪問的連接數(shù),或者在限流控制中限制同時執(zhí)行的線程數(shù)量。

import java.util.concurrent.Semaphore;
public class ResourcePool {
    private static final int MAX_AVAILABLE = 5;
    private final Semaphore available = new Semaphore(MAX_AVAILABLE, true);
    public Object getItem() throws InterruptedException {
        available.acquire();
        try {
            // 模擬獲取資源的操作
            return getNextAvailableItem();
        } finally {
            // 保證在資源使用后一定會釋放許可證
            available.release();
        }
    }
    // 此處省略了資源管理的其他邏輯...
    public static void main(String[] args) {
        final ResourcePool pool = new ResourcePool();
        for (int i = 0; i < 10; i++) {
            new Thread(() -> {
                try {
                    Object item = pool.getItem();
                    // 模擬使用資源
                    System.out.println(Thread.currentThread().getName() + " 獲取了資源");
                    Thread.sleep((long) (Math.random() * 1000));
                    // 假設這里是使用資源完成后的操作
                } catch (InterruptedException e) {
                    Thread.currentThread().interrupt();
                }
            }).start();
        }
    }
    // 此處省略了getNextAvailableItem方法的實現(xiàn),它應該負責分配資源
}

在以上代碼示例中,我們設置了最大并發(fā)數(shù),并通過 Semaphore 來限制訪問資源的線程數(shù)。當所有許可證都被占用時,后來的線程將會等待直到有線程釋放許可證。

3.4 和其他同步工具的比較

相比其他同步工具,Semaphore 提供了對資源的并發(fā)訪問控制,而 CountDownLatch 和 CyclicBarrier 更側(cè)重于線程的協(xié)調(diào)和等待。

3.5 注意事項和最佳實踐

使用 Semaphore 時,要確保在資源使用后,準確無誤地釋放許可證,否則可能會導致其他線程永久等待。在實際應用中,尤其在復雜的業(yè)務邏輯里,通常建議使用 try-finally` 語句確保許可證的正確釋放。
同時,合理配置許可證的數(shù)量對于系統(tǒng)的穩(wěn)定性和性能至關(guān)重要。對于資源競爭激烈的場景,設置過少的許可證可能會導致系統(tǒng)響應時間增長;反之,設置過多的許可證則可能會超出系統(tǒng)資源的實際承載能力,造成資源的浪費或系統(tǒng)崩潰。

總結(jié)

到此這篇關(guān)于Java中的CyclicBarrier、CountDownLatch和Semaphore的具體使用的文章就介紹到這了,更多相關(guān)Java CyclicBarrier CountDownLatch Semaphore內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 聊聊springboot2.2.3升級到2.4.0單元測試的區(qū)別

    聊聊springboot2.2.3升級到2.4.0單元測試的區(qū)別

    這篇文章主要介紹了springboot 2.2.3 升級到 2.4.0單元測試的區(qū)別,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • 基于JDK8總結(jié)java中的interrupt

    基于JDK8總結(jié)java中的interrupt

    本文是基于JDK8總結(jié)java中的interrupt知識,需要的朋友可以參考下
    2017-12-12
  • SpringBoot中@ConditionalOnProperty的使用及作用詳解

    SpringBoot中@ConditionalOnProperty的使用及作用詳解

    這篇文章主要介紹了SpringBoot中@ConditionalOnProperty的使用及作用詳解,@ConditionalOnProperty通過讀取本地配置文件中的值來判斷 某些 Bean 或者 配置類 是否加入spring 中,需要的朋友可以參考下
    2024-01-01
  • SpringBoot使用redis實現(xiàn)session共享功能

    SpringBoot使用redis實現(xiàn)session共享功能

    這篇文章主要介紹了pringboot項目使用redis實現(xiàn)session共享,文中通過代碼示例講解的非常詳細,對大家的學習或工作有一定的幫助,需要的朋友可以參考下
    2024-05-05
  • Java單例模式、饑餓模式代碼實例

    Java單例模式、饑餓模式代碼實例

    這篇文章主要介紹了Java單例模式、饑餓模式代碼實例,本文直接給出代碼實例,需要的朋友可以參考下
    2015-05-05
  • Java中super和this的用法詳解

    Java中super和this的用法詳解

    這篇文章主要介紹了Java中super和this的用法詳解,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-08-08
  • Java使用EasyExcel實現(xiàn)高效的Excel讀寫操作

    Java使用EasyExcel實現(xiàn)高效的Excel讀寫操作

    在日常開發(fā)中,Excel 文件的讀寫操作是一個常見的需求,EasyExcel 是阿里巴巴開源的一個高性能、易用的 Excel 讀寫庫,可以大幅提高處理 Excel 文件的效率,本篇博客將從 EasyExcel 的基本概念、優(yōu)勢、安裝、讀寫操作以及高級用法展開,需要的朋友可以參考下
    2024-12-12
  • java 依賴包引入本地maven庫的實現(xiàn)示例

    java 依賴包引入本地maven庫的實現(xiàn)示例

    本文主要介紹了java 依賴包引入本地maven庫的實現(xiàn)示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2025-12-12
  • spring中websocket定時任務實現(xiàn)實時推送

    spring中websocket定時任務實現(xiàn)實時推送

    本文主要介紹了spring中websocket定時任務實現(xiàn)實時推送,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-01-01
  • Java生成日期時間存入Mysql數(shù)據(jù)庫的實現(xiàn)方法

    Java生成日期時間存入Mysql數(shù)據(jù)庫的實現(xiàn)方法

    本文主要介紹了Java生成日期時間存入Mysql數(shù)據(jù)庫的實現(xiàn)方法,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-03-03

最新評論

大丰市| 云安县| 河津市| 东乌珠穆沁旗| 韩城市| 玉门市| 罗山县| 海林市| 织金县| 象山县| 上林县| 通许县| 罗田县| 沭阳县| 禹州市| 香格里拉县| 太康县| 凌海市| 河南省| 江门市| 射洪县| 墨脱县| 资源县| 健康| 亳州市| 金寨县| 宁国市| 探索| 马公市| 松原市| 邳州市| 庆元县| 天镇县| 安庆市| 苍梧县| 定边县| 浦北县| 湟中县| 百色市| 阿勒泰市| 普定县|