Java LinkedBlockingQueue和ArrayBlockingQueue分析

weixin_34162629發表於2016-01-17

LinkedBlockingQueue是一個連結串列實現的堵塞佇列,在連結串列一頭增加元素,假設佇列滿。就會堵塞。還有一頭取出元素。假設佇列為空。就會堵塞。


LinkedBlockingQueue內部使用ReentrantLock實現插入鎖(putLock)和取出鎖(takeLock)。

putLock上的條件變數是notFull。即能夠用notFull喚醒堵塞在putLock上的執行緒。takeLock上的條件變數是notEmtpy。就可以用notEmpty喚醒堵塞在takeLock上的執行緒。


知道了LinkedBlockingQueue,再來理解ArrayBlockingQueue就比較好理解了。類似LinkList和ArrayList的差別。假設知道佇列的大小,那麼使用ArrayBlockIngQueue就比較合適了,由於它使用迴圈陣列實現,可是假設不知道佇列未來的大小,那麼使用ArrayBlockingQueue就必定會導致陣列的來回複製。減少效率。


記住多執行緒保護的一定是資料,而不是程式碼,在此例中,鎖保護的也是當中共享的佇列物件,防止出現不一致的情況。

原文:http://blog.csdn.net/hongchangfirst/article/details/39667677

作者:hongchangfirst

hongchangfirst的主頁:http://blog.csdn.net/hongchangfirst


相關文章