countdownlatch 主要是作用是用來維護乙個執行緒控制多個執行緒,內部是通過乙個計數器實現的,當我們建立乙個countdownlatch物件的時候,就需要指定乙個數值,這個數值就表示了執行緒的數量,每當乙個執行緒任務執行完畢,計數器就會減 1,當計數器的值變為0時,就表示所有的執行緒都已經執行完畢,可以執行後續的程式。
例項分析
countdownlatch內部依賴sync實現,而sync繼承aqs。countdownlatch僅提供了乙個構造方法:
// count 指定計數值
public countdownlatch(int count)
sync為countdownlatch的乙個內部類,其定義如下:
private static final class sync extends abstractqueuedsynchronizer
int getcount()
protected int tryacquireshared(int acquires)
protected boolean tryreleaseshared(int releases)
}}
通過這個內部類sync我們可以清楚地看到countdownlatch是採用共享鎖來實現的。
共享鎖:可簡單的理解為讀鎖去競爭資源,假如競爭到了,則跟它一起共享這個資源的佇列的執行緒,都要被依次喚醒,共同查這個資料。
await()
countdownlatch提供await()方法來使當前執行緒在鎖存器倒計數至零之前一直等待,除非執行緒被中斷,定義如下:
public boolean await(long timeout, timeunit unit)
throws interruptedexception
await其內部使用aqs的acquiresharedinterruptibly(int arg):
public final boolean tryacquiresharednanos(int arg, long nanostimeout)
throws interruptedexception
在內部類sync中重寫了tryacquireshared(int arg)方法:
protected int tryacquireshared(int acquires)
getstate()獲取同步狀態,其值等於計數器的值,從這裡我們可以看到如果計數器值不等於0,則會呼叫doacquiresharedinterruptibly(int arg),該方法為乙個自旋方法會嘗試一直去獲取同步狀態:
private void doacquiresharedinterruptibly(int arg)
throws interruptedexception
}//等待
if (shouldparkafte***iledacquire(p, node) &&
parkandcheckinterrupt())
throw new interruptedexception();
}} finally
}
java併發程式設計之Exchanger
exchanger v 可以交換的物件型別 可以在對中對元素進行配對和交換的執行緒的同步點。每個執行緒將條目上的某個方法呈現給 exchange 方法,與夥伴執行緒進行匹配,並且在返回時接收其夥伴的物件。exchanger 可能被視為 synchronousqueue 的雙向形式。exchanger...
java併發程式設計之Synchronized關鍵字
1.synchronized關鍵字使用前介紹 1 使用synchronized關鍵字修飾方法,ps 在這裡要特別需要注意的是,當有兩個或者以上執行緒的時候,其中有乙個執行緒獲取了該方法的物件鎖執行同步方法的時候,其他的執行緒仍然可以訪問其他的非使用synchronized的方法,也就是非同步的了。2...
java併發程式設計之synchronized
上篇部落格沒寫好,排版改了好多次,看著實在頭疼所以就沒準備往下寫了,今天講下同步使用到的關鍵字synchronized,這個關鍵字可以是用在方法上,也可以使用再 塊上,synchronized作用在方法上,它的鎖物件是當前例項物件 public class syncthreadtest implem...