2016-08-03 180 views
0

我讀了關於java中的併發隊列,並且我收到關於LinkedTransferQueue的混淆。什麼是LinkedTransferQueue的類型(是阻塞隊列還是非阻塞隊列)?我已經閱讀LinkedTransferQueue使用CAS(比較和交換)方法,並從不安全的公園方法,並從像ConcurrentLinkedQueue節點和指針組成,它推動的想法,它是一個非阻塞隊列。但接口TransferQueue延伸BlockingQueue。它看起來不明確。最後是LinkedTransferQueue阻塞還是非阻塞隊列?LinkedTransferQueue是阻塞隊列還是非阻塞隊列?

+1

您是否想知道'TransferQueue'是否阻塞或者'ConcurrentLinkedQueue'是否被阻塞?前者是阻塞的,後者不是 –

+0

我想知道事實上的ConcurrentLinkedQueue是阻塞的,但它是通過使用非阻塞算法實現的,因爲這個TransferQueue不能擴展BlockingQueue – pacman

+1

爲什麼你問'TransferQueue'是一個接口),還有'ConcurrentLinkedQueue'(它是一個不會執行'TransferQueue'的類)在同一個問題中?而且,當你閱讀javadoc時,你在問什麼並不明顯? –

回答

2

LinkedTransferQueue是一個無界隊列,儘管它是BlockingQueue它實際上永遠不會達到普通的生產者/消費者模式正常BlockingQueue實現可能實現的。

那麼,它是或不是它阻止?它實際上取決於操作。例如,下面列出了一些。

非阻塞操作:

  • offer
  • put
  • add
  • poll
  • tryTransfer

阻塞操作:

  • take
  • transfer

點是,如果一個操作可以不受阻塞它會實現。由於LinkedTransferQueue被強制爲無限制,因此它可以通過阻塞和非阻塞操作逃脫。

如果有興趣,我通過Java 8實現發現了這一點。

+0

感謝有關方法的解釋,它澄清了情況。你如何區分阻塞和非阻塞方法的區別?其次,你對生產者/消費者和LinkedTransferQueue意味着什麼? – pacman

+0

典型的生產者/消費者使用情況類似於*如果此隊列中有空間,則將此元素放在隊列中,如果不等到有空間,則反之亦然*。由於沒有固定的大小,因此'LinkedTransferQueue'有兩種阻塞模式。 ** 1。**等待一個元素存在於這個隊列中。 ** 2。**等待消耗線程在此隊列中 –

+0

區分。我查看了放置代碼,並且有一個標誌說明我們應該進行什麼類型的操作。 'SYNC','ASYNC','NOW','TIMED'。同步和定時是你的阻止操作,而異步和現在是非阻塞的。 –

-1

Javadoc

基於鏈接節點的任意的blocking隊列。

+0

@downvoter今天超越你自己。來自Javdoc帽子的引用回答這個問題是錯誤的答案?你應該倒退太陽,而不是我。 – EJP