Java并發(fā)編程之CountDownLatch解析
Java的CountDownLatch
ReentrantLock為獨(dú)占鎖,也即排他鎖,同一時(shí)刻只能有一個(gè)線程持有鎖?,F(xiàn)在來看幾種共享鎖。
CountDownLatch
public CountDownLatch(int count) { if (count < 0) throw new IllegalArgumentException("count < 0"); this.sync = new Sync(count); } private final Sync sync; private static final class Sync extends AbstractQueuedSynchronizer { private static final long serialVersionUID = 4982264981922014374L; Sync(int count) { //設(shè)置資源總數(shù) setState(count); } int getCount() { return getState(); } protected int tryAcquireShared(int acquires) { //資源 return (getState() == 0) ? 1 : -1; } protected boolean tryReleaseShared(int releases) { // Decrement count; signal when transition to zero for (;;) { //1、獲取當(dāng)前資源數(shù) int c = getState(); if (c == 0) return false; //2、釋放一個(gè)資源 int nextc = c-1; //3、CAS更新資源數(shù) if (compareAndSetState(c, nextc)) return nextc == 0; } } }
生成CountDownLatch時(shí)需要傳入資源總數(shù),代表所有線程總共享有這么多資源。
Sync為一個(gè)實(shí)現(xiàn)了AQS的內(nèi)部類,代理CountDownLatch的獲取和釋放操作。
public void await() throws InterruptedException { sync.acquireSharedInterruptibly(1); } public void countDown() { sync.releaseShared(1); }
線程調(diào)用countDown時(shí),最終調(diào)用Sync中的tryReleaseShared,將總資源減1。
調(diào)用await時(shí),最終調(diào)用Sync中tryAcquireShared,看資源是否全部釋放完。
需要所有線程等待某個(gè)條件完成后,才執(zhí)行某個(gè)動(dòng)作時(shí),可以使用CountDownLatch。
到此這篇關(guān)于Java并發(fā)編程之CountDownLatch解析的文章就介紹到這了,更多相關(guān)Java的CountDownLatch內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Spring Boot與Kotlin定時(shí)任務(wù)的示例(Scheduling Tasks)
這篇文章主要介紹了Spring Boot與Kotlin定時(shí)任務(wù)的示例(Scheduling Tasks),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-03-03springboot2?使用activiti6?idea插件的過程詳解
這篇文章主要介紹了springboot2?使用activiti6?idea插件,本文通過截圖實(shí)例代碼相結(jié)合給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-03-03深入解析Java的Servlet過濾器的原理及其應(yīng)用
這篇文章主要介紹了深入解析Java的Servlet過濾器的原理及應(yīng)用,Java編寫的Servlet通常是一個(gè)與網(wǎng)頁一起作用于瀏覽器客戶端的程序,需要的朋友可以參考下2016-01-01深入分析JAVA Synchronized關(guān)鍵字
這篇文章主要介紹了析JAVA Synchronized關(guān)鍵字的相關(guān)知識,文中代碼非常詳細(xì),幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下2020-06-06Mybatis傳遞多個(gè)參數(shù)進(jìn)行SQL查詢的用法
本文給大家介紹Mybatis傳遞多個(gè)參數(shù)進(jìn)行SQL查詢的用法的相關(guān)知識,本文還給大家介紹了mybatis通過Map傳遞多個(gè)參數(shù)和JavaBean傳遞多個(gè)參數(shù),本文介紹的非常詳細(xì),具有參考借鑒價(jià)值,感興趣的朋友一起學(xué)習(xí)吧2016-06-06springboot配置ssl后啟動(dòng)一直是端口被占用的解決
這篇文章主要介紹了springboot配置ssl后啟動(dòng)一直是端口被占用的解決方案,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-08-08