2012-05-09 68 views
4

我確信這個問題的正確答案取決於池中對象的類型和工作負載,所以我將詳細介紹一下我的實現:Stack或LinkedList for ObjectPool?

我有一個ObjectPool用於池長時間運行的命令行進程。這些進程通過stdin/stdout進行通信,並執行文件/網絡操作。許多任務的完成速度比其他任務快得多,並且可能會將進程快速返回到池中所有對池的訪問都必須是線程安全的。

我的問題是,我最好用LIFO/Stack或FIFO/ConcurrentLinkedQueue管理池嗎?我在兩邊的推理:

  • 一個堆棧保持「熱」對象在資源可以保持緩存/等。更長時間。
  • FIFO在進程之間平衡呼叫更均勻,每個進程的工作量更少。謝謝!
+9

或者您可以使用['ConcurrentLinkedDeque'](http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ConcurrentLinkedDeque.html)並結合兩者的優點。 – Jeffrey

+0

因此,每個過程都是專門研究某個事物,或者他們都可以做同樣的事情? – Tudor

+0

@Tudor:所有人都可以做同樣的事情。任何對象都和借用下一個一樣好()呃。 – Will

回答

3

我的第一個想法是:基準測試!你的兩個論點看起來都很合理。您應該實施這兩種策略,並進行測試,其中哪些會導致更高的吞吐量。

您在問題中描述的問題類似於操作系統必須面對的進程安排。因此,也許利用優先次序是有用的。使用PriorityQueue併爲您的任務分配不同的優先級,這些優先級可能隨時間而動態變化,例如Aging

最後但並非最不重要的一點,正如已經在評論中指出的那樣,您可以嘗試使用ConcurrentLinkDeque,並讓一些獲取前部物體和一些後部物體。在這裏,我的建議也是嘗試並衡量哪種平衡效果最好。

1

它可能不會產生性能差異。做任何最簡單的代碼,並使代碼易於理解。當你處理執行文件和網絡I/O的命令行進程時,這裏和那裏的高速緩存未命中都不會有什麼區別......這些將以幾個數量級爲主。