2011-03-08 1020 views

回答

4
List<String> list = Collections.synchronizedList(new ArrayList<String>()); 
+2

這是一個或多或少的'Vector'插件替代品。但它不一定是正確的使用。 – 2011-03-08 23:01:36

+0

謝謝。我將不得不將一些向量轉換爲列表。 – VSH3R 2011-03-10 04:44:27

0

陣列,但如果你不知道的大小,使用concurrentmap

+0

假設你想快速隨機訪問元素(這就是爲什麼列表將是一個壞主意) – necromancer 2011-03-08 22:22:24

+0

區別是:一個地圖提供按鍵隨機訪問,一個列表通過索引提供隨機訪問(或多或少有效)。 – 2011-03-08 22:30:10

+0

你的意思是地圖提供O(log(n))訪問,而列表提供O(1)?那麼它會混淆討論,將其稱爲列表 - 它是一個在列表界面中僞裝的數組。如果你知道尺寸,陣列顯然是最好的,最容易理解的選擇。只有當你不知道你選擇的尺寸是在地圖之間,還是在多線程情況下可提高性能的陣列時,它們會提供不可預測的性能。 – necromancer 2011-03-08 23:10:48

-1

使用列表的實施和他們像

List<?> list = Collections.synchronizedList(new ArrayList<?>()); 
5

對於線程安全的情況下進行同步,使用ArrayList

對於線程安全的情況下,使用什麼是最合適你的情況,CopyOnWriteArrayListQueueBlockingDeque等前來諮詢更多,我們需要知道你是怎麼處理的事情與你的收藏。

我建議不要使用Collections.synchronizedList(...)包裝,因爲它可能無法很好地擴展(除非您不太在意可擴展性)。但這一切都取決於你的背景。

+0

你能解釋爲什麼'Collections.synchronizedList(...)'不能縮放嗎? – corsiKa 2011-03-08 22:28:53

+1

如果您的使用模式爲99%讀取和1%寫入,CopyOnWriteArrayList提供更好的性能(讀取COWAL javadoc)。但這一切都取決於使用模式。 – mindas 2011-03-08 22:30:42

+0

夠公平 - 一個有趣的課程。我不是100%確定我同意它(即它解決了可能通過使用更好的設計可能解決的問題),但有時理想和實際是兩個不同的事情。 +1 – corsiKa 2011-03-08 22:38:29

11

它看起來像使用Java進行編程時,我們不會在涉及到線程時使用向量。

你需要使用Vector被認爲是在大多數情況下是一件壞事,瞭解爲什麼。原因是:

  • Vector在每個操作上同步。大多數上下文不需要細粒度的同步,因此這是不必要的性能開銷。

  • Vector.elements()方法返回一個不具有快速失敗語義的Enumeration

回到你的問題。該方案取決於你的線程正在嘗試做的:

  • 如果用例不需要同步所有,使用ArrayList,或LinkedList。您通常會使用這些:

    • 該列表是線程限制的;即只有一個線程可以訪問它。
    • 該列表需要粗粒度同步;即在執行一系列操作時的獨佔訪問。在這種情況下,您通常會創建一個自定義類,其中包含未在自定義類API中公開的嵌入(例如)ArrayList
  • 如果用例需要細粒度同步,Collections.synchronizedList包裝相當於一個Vector。或者,您可以堅持使用Vector並避免使用elements()操作。

  • A CopyOnWriteArrayList列表的優點是它的迭代器支持併發修改...在某種意義上。如果您的應用程序主要執行讀取列表,它也會更好地擴展。讀操作根本不需要明確同步,通常只需要讀取一次volatile一次。但另一面是寫操作確實同步,並且比「正常」的價格貴得多。

的另一個問題VectorCollections.synchronizedList包裝的是,一些用例需要較粗的同步;例如測試列表的大小並有條件地在單個同步操作中添加元素。 QueueDeque類提供了更高級別的抽象處理這種事情......用於涉及從一個線程異步傳遞工作到另一個線程的用例。


底線是沒有一刀切的解決方案。您需要了解應用程序設計的併發特性,並相應地選擇您的數據結構。


最後,如果你是編程爲Java ME,你可能會堅持使用Vector,這取決於J2ME配置文件,你的目標。

+0

@ VSH3R請參閱http://stackoverflow.com/questions/703990/why-is-c-list-not-thread-safe和http://www.ibm。 COM/developerWorks的/ JAVA /庫/ J-jtp09263.html。 – tiago2014 2011-03-09 00:01:31

相關問題