Java并發(fā)編程之CountDownLatch解析
Java的CountDownLatch
ReentrantLock為獨占鎖,也即排他鎖,同一時刻只能有一個線程持有鎖。現(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ù) 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、獲取當前資源數(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。
到此這篇關于Java并發(fā)編程之CountDownLatch解析的文章就介紹到這了,更多相關Java的CountDownLatch內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Spring Boot與Kotlin定時任務的示例(Scheduling Tasks)
這篇文章主要介紹了Spring Boot與Kotlin定時任務的示例(Scheduling Tasks),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-03-03springboot2?使用activiti6?idea插件的過程詳解
這篇文章主要介紹了springboot2?使用activiti6?idea插件,本文通過截圖實例代碼相結(jié)合給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-03-03