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

Java并發(fā)編程之CountDownLatch原理詳解

 更新時間:2023年12月11日 08:48:16   作者:程光CS  
這篇文章主要介紹了Java并發(fā)編程之CountDownLatch原理詳解,CountDownLatch類中使用了一個繼承自AQS的共享鎖Sync對象,構造CountDownLatch對象時會將傳入的線程數(shù)值設為AQS的state值,需要的朋友可以參考下

一、CountDownLatch介紹

在日常開發(fā)中經(jīng)常會遇到需要在主線程中開啟多個線程去并行執(zhí)行任務,并且主線程需要等待所有子線程執(zhí)行完畢后再進行匯總的場景。

在 CountDownLatch 出現(xiàn)之前一般都使用線程的join()方法來實現(xiàn)這一點,但是 join 方法不夠靈活,不能夠滿足不同場景的需要,所以JDK開發(fā)組提供了 CountDownLatch 這個類,使用CountDownLatch 會更優(yōu)雅。

并且CountDownLatch 可以在子線程的任何位置讓 await 方法返回而不一定必須線程結(jié)束,這比join更加靈活。使用 CountDownLatch 的代碼如下:

public static void main(String[] args) throws InterruptedException {
    //內(nèi)部sync同步器的state值設為3
    CountDownLatch countDownLatch = new CountDownLatch(3);

    for (int i = 1;i <= 3;i++) {
        new Thread(() -> {
            try {
                Thread.sleep(5000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            } finally {
                System.out.println("目標代碼塊運行完畢");
                //每調(diào)用一次countDown()內(nèi)部調(diào)用releaseShared(1)都會使state值減一
                countDownLatch.countDown();
            }
            try {
                Thread.sleep(2000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("線程結(jié)束");
        }).start();
    }
    System.out.println("所有線程已啟動");
    //主線程調(diào)用await()方法后就會進入阻塞,直到所有線程調(diào)用了countDown()使state值被減為0,或者主線程被中斷,才會從阻塞返回
    countDownLatch.await();
    System.out.println("所有線程目標代碼塊已運行完畢");
}

二、CountDownLatch原理

CountDownLatch類中使用了一個繼承自AQS的共享鎖Sync對象,構造CountDownLatch對象時會將傳入的線程數(shù)值設為AQS的state值

當一個線程結(jié)束運行調(diào)用countDown()方法時,內(nèi)部調(diào)用releaseShared(1)時調(diào)用Sync中重寫的鉤子方法tryReleaseShared()都會使state值減一,當被state被減為0后tryReleaseShared才會返回true,繼而調(diào)用doReleaseShared喚醒同步隊列中被阻塞的線程

在這里插入圖片描述

在這里插入圖片描述

在這里插入圖片描述

主線程調(diào)用await()方法后就會進入阻塞,其內(nèi)部調(diào)用的acquireSharedInterruptibly方法,只有當鉤子方法tryAcquireShared返回值>=0時才能拿到鎖,而Sync中重寫的tryAcquireShared只有當state為0才會返回1,否則返回-1,因此只有到最后一個線程調(diào)用了countDown()使state值被減為0繼而喚醒同步隊列中阻塞的主線程,或者主線程被中斷,才會從阻塞返回。

到此這篇關于Java并發(fā)編程之CountDownLatch原理詳解的文章就介紹到這了,更多相關CountDownLatch原理內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

最新評論