2009-01-17 93 views
12

Java開發中強調的一個模塊始終使用Vector上的ArrayList。矢量已棄用。這可能是事實,但Vector和Hashtable具有同步的優點。在Java中使用Hashtable,Vector或HashMap或ArrayList

我正在使用面向併發的並行應用程序,使用像Vector一樣同步的對象會不會有好處?看起來他們有他們的位置?

+0

向量還沒有被棄用。 – Champ 2010-09-12 08:44:00

+0

Netbeans宣佈Java 6的最新版本宣稱Vector已被棄用......它一定是在其他地方發佈的,因爲我已經注意到幾個月後需要找到它的替代品以及一些非已棄用的類仍然需要它。 – 2010-09-23 11:32:56

回答

17

Vector和Hashtable的問題在於它們只在本地同步。它們不會在併發應用程序中破壞(如在損壞的數據中),然而,由於本地同步(例如get是同步的,但只有在得到返回時),您仍然希望執行自己的同步,無論如何,作爲內容的迭代。現在,即使你的put方法需要一些額外的同步來配合迭代同步,並且你最終會遇到你的Hashtable/Vector被雙重同步的情況。

+0

究竟哪些不正確? – falstro 2009-01-17 18:28:37

13

如果您需要同步ArrayList或HashMap,可以將它們包裝起來。

List list = Collections.synchronizedList(new ArrayList(...)); 
Map m = Collections.synchronizedMap(new HashMap(...)); 

個人而言,我覺得在這些集合重線程代碼不是非常有用的「同步」的方法。有一些更新的集合可以提供更多幫助,但大多數情況下,我發現自己正在創建自己的同步對象並在其周圍進行同步,或者使用java.util.concurrent中的新鎖定

8

同步有它的位置,但那不是隻有VectorArrayList之間的區別。 Vector每次超過其容量時,其內部存儲陣列增長一個固定的數量,而ArrayList增長一個固定的因子,這通常是一個更好的方法(因爲它給出了O(1)的amortized cost附加項目)。

還要注意的是Collections.synchronizedList()可以用來創建任何List實現同步視圖,這樣你就不必被綁定到的Vector的特性(您可能需要例如同步LinkedList)。

0

在我看來,唯一的時候,你會需要集合本身是線程安全的是:

  • 如果集合可見從類的外部(公共或默認範圍內)
  • 如果你從一個方法
  • 如果集合類

的靜態成員所有這些都可能是一個壞主意設計明智返回的句柄集合。

更好的方法是將集合本身​​設置爲「私有」或「受保護」,並通過同步方法訪問它。在靜態成員的情況下,如果你需要這樣做,Singleton將是更好的選擇。

17

ConcurrentHashMapway faster比散列表。這是併發,不只是同步。它同時承認多個讀者/作者。

雖然沒有這樣的'併發'數組列表。根據您的需求,CopyOnWriteArrayList可能會或可能不會成爲您需要的。

相關問題