Java中的共享鎖CountDownLatch及源碼解析
前言
CountDownLatch是一種同步輔助工具,允許一個或多個線程等待,直到在其它線程中執(zhí)行的一組操作完成;CountDownLatch使用指定的計數(shù)初始化。
wait方法會阻塞,直到當前計數(shù)由于countDown方法的調(diào)用而達到零,之后所有的等待線程都會被釋放,任何后續(xù)的wait調(diào)用都會立即返回。這是一種一次性現(xiàn)象,計數(shù)無法重置。如果需要重置計數(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í)行
上面的示例是一個主線程等待其它三個 線程執(zhí)行,執(zhí)行完成后調(diào)用countDown方法,計數(shù)減一,直到所有的線程執(zhí)行完成,計數(shù)歸0,然后await方法放回,主線程繼續(xù)執(zhí)行。
二、CountDownLatch源碼解析
public void countDown() { sync.releaseShared(1); }
countDown方法會遞減鎖的計數(shù)器,如果計數(shù)為0,則釋放所有等待的線程。如果當前計數(shù)大于0,則遞減。如果新計數(shù)為0,則出于線程調(diào)度的目的重新啟用所有等待線程。如果當前計數(shù)等于0,那么什么也不發(fā)生。
public void await() throws InterruptedException { sync.acquireSharedInterruptibly(1); }
await方法會使當前線程等待,直到鎖的計數(shù)器為0,除非線程被中斷。如果當前計數(shù)為0,則此方法立即返回。如果當前計數(shù)大于0,則出于線程調(diào)度目的,當前線程將被禁用,并處于休眠狀態(tài),直到發(fā)生一下兩種情況之一:
1.由于調(diào)用了countDown方法,計數(shù)達到了0;
2.其它線程終端當前線程;
到此這篇關(guān)于Java中的共享鎖CountDownLatch及源碼解析的文章就介紹到這了,更多相關(guān)Java中的共享鎖CountDownLatch內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Springboot基于Redisson實現(xiàn)Redis分布式可重入鎖源碼解析
這篇文章主要介紹了Springboot基于Redisson實現(xiàn)Redis分布式可重入鎖,本文通過案例源碼分析給大家介紹的非常詳細,對大家的學(xué)習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-03-03springboot整合prometheus實現(xiàn)資源監(jiān)控的詳細步驟
Spring Boot與Prometheus的整合可以實現(xiàn)對Spring Boot應(yīng)用的實時監(jiān)控,有助于更好地維護應(yīng)用的性能,本文給大家介紹springboot整合prometheus實現(xiàn)資源監(jiān)控的詳細步驟,感興趣的朋友跟隨小編一起看看吧2024-11-11Java的方法和this關(guān)鍵字如何理解與應(yīng)用
Java語言中的“方法”(Method)在其他語言當中也可能被稱為“函數(shù)”(Function)。對于一些復(fù)雜的代碼邏輯,如果希望重復(fù)使用這些代碼,并且做到“隨時任意使用”,那么就可以將這些代碼放在一個大括號{}當中,并且起一個名字。使用代碼的時候,直接找到名字調(diào)用即可2021-10-10Jmeter壓力測試簡單教程(包括服務(wù)器狀態(tài)監(jiān)控)
Jmeter是一個非常好用的壓力測試工具。Jmeter用來做輕量級的壓力測試,非常合適,本文詳細的介紹了Jmeter的使用,感性的可以了解一下2021-11-11