java併發程式設計之CountDownLatch

2021-09-08 03:29:00 字數 1636 閱讀 8564

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...