程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> JAVA綜合教程 >> 【轉】簡析SynchronousQueue,LinkedBlockingQueue,ArrayBlockingQueue,linkedblockingqueue

【轉】簡析SynchronousQueue,LinkedBlockingQueue,ArrayBlockingQueue,linkedblockingqueue

編輯:JAVA綜合教程

【轉】簡析SynchronousQueue,LinkedBlockingQueue,ArrayBlockingQueue,linkedblockingqueue


轉載地址:http://blog.csdn.net/mn11201117/article/details/8671497

SynchronousQueue

        SynchronousQueue是無界的,是一種無緩沖的等待隊列,但是由於該Queue本身的特性,在某次添加元素後必須等待其他線程取走後才能繼續添加;可以認為SynchronousQueue是一個緩存值為1的阻塞隊列,但是 isEmpty()方法永遠返回是true,remainingCapacity() 方法永遠返回是0,remove()和removeAll() 方法永遠返回是false,iterator()方法永遠返回空,peek()方法永遠返回null。

        聲明一個SynchronousQueue有兩種不同的方式,它們之間有著不太一樣的行為。公平模式和非公平模式的區別:如果采用公平模式:SynchronousQueue會采用公平鎖,並配合一個FIFO隊列來阻塞多余的生產者和消費者,從而體系整體的公平策略;但如果是非公平模式(SynchronousQueue默認):SynchronousQueue采用非公平鎖,同時配合一個LIFO隊列來管理多余的生產者和消費者,而後一種模式,如果生產者和消費者的處理速度有差距,則很容易出現饑渴的情況,即可能有某些生產者或者是消費者的數據永遠都得不到處理。

LinkedBlockingQueue

        LinkedBlockingQueue是無界的,是一個無界緩存的等待隊列。

        基於鏈表的阻塞隊列,內部維持著一個數據緩沖隊列(該隊列由鏈表構成)。當生產者往隊列中放入一個數據時,隊列會從生產者手中獲取數據,並緩存在隊列內部,而生產者立即返回;只有當隊列緩沖區達到最大值緩存容量時(LinkedBlockingQueue可以通過構造函數指定該值),才會阻塞生產者隊列,直到消費者從隊列中消費掉一份數據,生產者線程會被喚醒,反之對於消費者這端的處理也基於同樣的原理。

        LinkedBlockingQueue之所以能夠高效的處理並發數據,還因為其對於生產者端和消費者端分別采用了獨立的鎖來控制數據同步,這也意味著在高並發的情況下生產者和消費者可以並行地操作隊列中的數據,以此來提高整個隊列的並發性能。

ArrayListBlockingQueue

         ArrayListBlockingQueue是有界的,是一個有界緩存的等待隊列。
         基於數組的阻塞隊列,同LinkedBlockingQueue類似,內部維持著一個定長數據緩沖隊列(該隊列由數組構成)。ArrayBlockingQueue內部還保存著兩個整形變量,分別標識著隊列的頭部和尾部在數組中的位置。
         ArrayBlockingQueue在生產者放入數據和消費者獲取數據,都是共用同一個鎖對象,由此也意味著兩者無法真正並行運行,這點尤其不同於LinkedBlockingQueue;按照實現原理來分析,ArrayBlockingQueue完全可以采用分離鎖,從而實現生產者和消費者操作的完全並行運行。Doug Lea之所以沒這樣去做,也許是因為ArrayBlockingQueue的數據寫入和獲取操作已經足夠輕巧,以至於引入獨立的鎖機制,除了給代碼帶來額外的復雜性外,其在性能上完全占不到任何便宜。 ArrayBlockingQueue和LinkedBlockingQueue間還有一個明顯的不同之處在於,前者在插入或刪除元素時不會產生或銷毀任何額外的對象實例,而後者則會生成一個額外的Node對象。這在長時間內需要高效並發地處理大批量數據的系統中,其對於GC的影響還是存在一定的區別。

         ArrayBlockingQueue和LinkedBlockingQueue是兩個最普通、最常用的阻塞隊列,一般情況下,處理多線程間的生產者消費者問題,使用這兩個類足以。

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved