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

Java中的共享鎖CountDownLatch及源碼解析

 更新時(shí)間:2023年11月16日 09:28:40   作者:立小研先森  
這篇文章主要介紹了Java中的共享鎖CountDownLatch及源碼解析,CountDownLatch是一種同步輔助工具,允許一個(gè)或多個(gè)線程等待,直到在其它線程中執(zhí)行的一組操作完成;CountDownLatch使用指定的計(jì)數(shù)初始化,需要的朋友可以參考下

前言

CountDownLatch是一種同步輔助工具,允許一個(gè)或多個(gè)線程等待,直到在其它線程中執(zhí)行的一組操作完成;CountDownLatch使用指定的計(jì)數(shù)初始化。

wait方法會(huì)阻塞,直到當(dāng)前計(jì)數(shù)由于countDown方法的調(diào)用而達(dá)到零,之后所有的等待線程都會(huì)被釋放,任何后續(xù)的wait調(diào)用都會(huì)立即返回。這是一種一次性現(xiàn)象,計(jì)數(shù)無(wú)法重置。如果需要重置計(jì)數(shù)的版本,可以參考CyclicBarrier。

一、CountDownLatch的使用方法

public class Test {
    public static void main(String[] args) throws InterruptedException {
        CountDownLatch latch = new CountDownLatch(3);
        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
                System.out.println("線程一執(zhí)行完成");
                latch.countDown();
            }
        }).start();
        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
                System.out.println("線程二執(zhí)行完成");
                latch.countDown();
            }
        }).start();
        new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("線程三執(zhí)行完成");
                latch.countDown();
            }
        }).start();
        System.out.println("主線程等待");
        latch.await();
        System.out.println("主線程開始執(zhí)行");
    }
}

執(zhí)行結(jié)果如下:

線程三執(zhí)行完成
主線程等待
線程二執(zhí)行完成
線程一執(zhí)行完成
主線程開始執(zhí)行

上面的示例是一個(gè)主線程等待其它三個(gè) 線程執(zhí)行,執(zhí)行完成后調(diào)用countDown方法,計(jì)數(shù)減一,直到所有的線程執(zhí)行完成,計(jì)數(shù)歸0,然后await方法放回,主線程繼續(xù)執(zhí)行。

二、CountDownLatch源碼解析

  public void countDown() {
        sync.releaseShared(1);
    }

countDown方法會(huì)遞減鎖的計(jì)數(shù)器,如果計(jì)數(shù)為0,則釋放所有等待的線程。如果當(dāng)前計(jì)數(shù)大于0,則遞減。如果新計(jì)數(shù)為0,則出于線程調(diào)度的目的重新啟用所有等待線程。如果當(dāng)前計(jì)數(shù)等于0,那么什么也不發(fā)生。

 public void await() throws InterruptedException {
        sync.acquireSharedInterruptibly(1);
    }

await方法會(huì)使當(dāng)前線程等待,直到鎖的計(jì)數(shù)器為0,除非線程被中斷。如果當(dāng)前計(jì)數(shù)為0,則此方法立即返回。如果當(dāng)前計(jì)數(shù)大于0,則出于線程調(diào)度目的,當(dāng)前線程將被禁用,并處于休眠狀態(tài),直到發(fā)生一下兩種情況之一:

1.由于調(diào)用了countDown方法,計(jì)數(shù)達(dá)到了0;

2.其它線程終端當(dāng)前線程;

到此這篇關(guān)于Java中的共享鎖CountDownLatch及源碼解析的文章就介紹到這了,更多相關(guān)Java中的共享鎖CountDownLatch內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Springboot基于Redisson實(shí)現(xiàn)Redis分布式可重入鎖源碼解析

    Springboot基于Redisson實(shí)現(xiàn)Redis分布式可重入鎖源碼解析

    這篇文章主要介紹了Springboot基于Redisson實(shí)現(xiàn)Redis分布式可重入鎖,本文通過(guò)案例源碼分析給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-03-03
  • Java JTable 實(shí)現(xiàn)日歷的示例

    Java JTable 實(shí)現(xiàn)日歷的示例

    這篇文章主要介紹了Java JTable 實(shí)現(xiàn)日歷的示例,幫助大家更好的理解和學(xué)習(xí)Java jtable的使用方法,感興趣的朋友可以了解下
    2020-10-10
  • springboot整合prometheus實(shí)現(xiàn)資源監(jiān)控的詳細(xì)步驟

    springboot整合prometheus實(shí)現(xiàn)資源監(jiān)控的詳細(xì)步驟

    Spring Boot與Prometheus的整合可以實(shí)現(xiàn)對(duì)Spring Boot應(yīng)用的實(shí)時(shí)監(jiān)控,有助于更好地維護(hù)應(yīng)用的性能,本文給大家介紹springboot整合prometheus實(shí)現(xiàn)資源監(jiān)控的詳細(xì)步驟,感興趣的朋友跟隨小編一起看看吧
    2024-11-11
  • NIO深入理解FileChannel使用方法原理

    NIO深入理解FileChannel使用方法原理

    這篇文章主要為大家介紹了NIO深入理解FileChannel的源碼示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-05-05
  • Java的方法和this關(guān)鍵字如何理解與應(yīng)用

    Java的方法和this關(guān)鍵字如何理解與應(yīng)用

    Java語(yǔ)言中的“方法”(Method)在其他語(yǔ)言當(dāng)中也可能被稱為“函數(shù)”(Function)。對(duì)于一些復(fù)雜的代碼邏輯,如果希望重復(fù)使用這些代碼,并且做到“隨時(shí)任意使用”,那么就可以將這些代碼放在一個(gè)大括號(hào){}當(dāng)中,并且起一個(gè)名字。使用代碼的時(shí)候,直接找到名字調(diào)用即可
    2021-10-10
  • Java8如何通過(guò)Lambda處理List集合

    Java8如何通過(guò)Lambda處理List集合

    這篇文章主要介紹了java8如何通過(guò)Lambda處理List集合,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-01-01
  • Jmeter壓力測(cè)試簡(jiǎn)單教程(包括服務(wù)器狀態(tài)監(jiān)控)

    Jmeter壓力測(cè)試簡(jiǎn)單教程(包括服務(wù)器狀態(tài)監(jiān)控)

    Jmeter是一個(gè)非常好用的壓力測(cè)試工具。Jmeter用來(lái)做輕量級(jí)的壓力測(cè)試,非常合適,本文詳細(xì)的介紹了Jmeter的使用,感性的可以了解一下
    2021-11-11
  • SpringBoot的SPI機(jī)制源碼解析

    SpringBoot的SPI機(jī)制源碼解析

    這篇文章主要為大家介紹了SpringBoot的SPI機(jī)制源碼解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-12-12
  • java實(shí)現(xiàn)大文件分割與合并的實(shí)例代碼

    java實(shí)現(xiàn)大文件分割與合并的實(shí)例代碼

    java實(shí)現(xiàn)大文件分割與合并的實(shí)例代碼,需要的朋友可以參考一下
    2013-03-03
  • java學(xué)習(xí)之JVM運(yùn)行時(shí)常量池理解

    java學(xué)習(xí)之JVM運(yùn)行時(shí)常量池理解

    這篇文章主要介紹了java學(xué)習(xí)之JVM運(yùn)行時(shí)常量池理解,對(duì)常量池的好處以及基本類型的包裝類常量池等作了簡(jiǎn)要分析,有需要的朋友可以借鑒參考下
    2021-09-09

最新評(píng)論