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

