同步工具類除了最熟悉的阻塞佇列之外,還包括semaphore、barrier以及latch。同樣,我們也可以建立屬於自己的同步工具類。所有的同步工具類都包含了一些特定的結構屬性:比如,封裝了一些狀態,而這些狀態將決定執行同步工具類的執行緒是繼續執行海蛇等待,除此而外,還提供了一些方法對狀態進行操作,以及高效的等待同步工具類進入到預期的狀態。
閉鎖最形象的比喻是一扇gate,在閉鎖到達結束狀態之前,這扇門始終處於關閉的狀態,任何執行緒都無法通過。而當閉鎖到達結束狀態,這扇門將開啟,進而允許所有的執行緒通過。一旦閉鎖達到結束狀態,這扇門將保持開啟的狀態,不會再關閉。換句話說,閉鎖的作用是保持某些活動直到其他活動都完成才繼續執行。
舉個例子,我們都知道併發在某些情況下,可以極大地提公升工作效率,縮短程式的執行時間,那麼我們該如何去獲取併發程式準確的執行時間,即在所有執行緒全部就緒的時刻啟動時間,而在所有執行緒全部結束的時刻終止時間。latch可以做到,看下面程式。
public
class
testharness finally
}catch(interruptedexception e)}};
t.start();
}long starttime=system.nanotime();
startgate.countdown();
endgate.await();
long endtime=system.nanotime();
return
"time: "+(endtime-starttime)+"ns";
}
由於startgate被設定為等待
startgate.await();
因此每個執行緒首先要做的工作就是在啟動門上等待,知道所有的執行緒全部就緒。並且,我們在為每個執行緒裝載任務時
finally
保證沒個執行緒最終都會執行使得endgate減1的任務
startgate.countdown();
注意startgate的初值為1,因此呼叫countdown方法後,門開啟,此時執行緒開始執行
end
gate.await();
endgate此時關閉,要做的工作就是等待且為零的時刻,然後開啟
如果沒用使用latch工具而去獲取並行執行緒的執行時間,執行緒在被建立之後將立即執行,顯然,先啟動的執行緒勢必會領先於後啟動的執行緒,並且活躍執行緒的數量會隨著時間的推移而慢慢減少或者增加,競爭程度也將發生變化。有了這個工具,我們今後在編寫併發程式是,只需要呼叫timetasks函式,並向其傳遞任務引數,就可以獲取併發時間了。
同步工具類
同步工具類可以是任何乙個物件,只要它根據其自身的狀態來協調執行緒的控制流。儲存物件的容器,還能協調生產者和消費者等執行緒之間的控制流 take和put等方法將阻塞,直到佇列達到期望的狀態 佇列即非空,也非滿 相當於一扇門 在閉鎖到達結束狀態之前,這扇門一直是關閉的,並且沒有任何執行緒能通過,當到達結...
同步工具類
同步工具類可以是任何乙個物件,只要它根據其自身的狀態來協調執行緒控制流。阻塞佇列 blockingqueue 可以作為同步工具類,其他型別的同步工具類還包括訊號量 semaphore 柵欄 barrier 以及閉鎖 latch 在平台類庫中還包含其他一些同步工具類的類,如果這些類還無法滿足需要,那麼...
同步工具類 CountDownLatch
countdownlatch是乙個同步工具類,它允許乙個或多個執行緒一直等待,直到其他執行緒執行完後再執行。例如,應用程式的主線程希望在負責啟動框架服務的執行緒已經啟動所有框架服務之後執行。countdownlatch是通過乙個計數器來實現的,計數器的初始化值為執行緒的數量。每當乙個執行緒完成了自己...