2013-03-19 102 views
2

我想知道哪種是使用EDU.oswego.cs.dl.util.concurrent.LinkedQueue的最佳選擇。替代使用LinkedQueue?

在以下情況:

public class testQueue extends LinkedQueue implements TestInterface { 

public void putTestObject (TestObject to) { 
    put(to); 
} 

我應該使用LinkedBlockingQueueLinkedTransferQueue

我只使用了put()take(),和isEmpty()方法

+0

我不知道Java 7的'LinkedTransferQueue'購買了什麼。 LinkedBlockingQueue應該是足夠的,除非這是一些支持高性能的收集。 – Gray 2013-03-19 15:35:18

+1

*爲什麼*你尋找替代品?你似乎有一個工作解決方案。那有什麼問題?你爲什麼要替換它? – 2013-03-19 15:44:22

回答

1

TransferQueue(其延伸BlockingQueue)提供了額外的操作transfer。如果您只使用put,takeisEmpty,那麼使用BlockingQueue就足夠了。

+0

順便說一下,不是'isEmpty'可能會返回'false',並且隨後的'take'可能會被阻塞。如果這是一個問題,可以考慮使用'peek'(返回但不刪除head元素,如果隊列爲空則返回null)。 – Javier 2013-03-19 15:52:27

1

LinkedBlockingQueue會沒事的。由於您沒有使用任何傳輸機制,因此LinkedQueue與LinkedBlockingQueue非常相似。唯一明顯的區別是,LinkedQueue在LBQ使用2時使用1個鎖。

+0

小心。你聽起來像是LBQ使用兩個鎖(這是你的意圖與否)是一件壞事。 LBQ使用兩個鎖,但它們彼此獨立,即對「puts」有鎖,對「takes」有鎖。關於這個「兩個鎖隊列」的更多細節,請看這裏:http://www.cs.rochester.edu/u/scott/papers/1996_PODC_queues.pdf – 2013-03-25 16:55:05

+1

@TonyRedwood我的意圖不是暗示好或壞,只是說明差異。無論如何,如果有任何兩個鎖具有更好的性能, – 2013-03-25 17:04:54