簡體   English   中英

在Java中使用Hashtable,Vector或HashMap或ArrayList

[英]Use Hashtable, Vector or HashMap or ArrayList in Java

一個在Java開發中受到壓力的模因總是在Vector上使用ArrayList。 Vector已棄用。 這可能是真的,但Vector和Hashtable具有同步的優勢。

我正在使用面向大量並發的應用程序,使用像Vector這樣的同步對象會不會有好處? 看來他們有自己的位置?

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

ConcurrentHashMap比Hashtable 它是並發的 ,而不僅僅是同步的。 它一次承認多個讀者/作者。

但是沒有這樣的'並發'數組列表。 根據您的需要, CopyOnWriteArrayList可能是您需要的,也可能不是。

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

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

我個人認為這些集合中的“synchronized”方法在繁重的線程代碼中並不是很有用。 有一些較新的集合可以幫助更多,但主要是我發現自己創建自己的同步對象並圍繞它們進行同步,或者使用java.util.concurrent中的新鎖

同步有它的位置,但這不是VectorArrayList之間的唯一區別。 每次超過其容量時, Vector會將其內部存儲陣列增加一個固定的數量,而ArrayList會以固定因子增長它,這通常是一種更好的方法(因為它為附加項目提供了攤銷成本 O(1)) 。

另請注意, Collections.synchronizedList()可用於在任何List實現上創建同步視圖,因此您不必綁定到Vector的特性(例如,您可能需要同步的LinkedList )。

您可以使用靜態集合方法將List或Map轉換為同步版本: http//java.sun.com/j2se/1.4.2/docs/api/java/util/Collections.html#synchronizedList(java.util .LIST)

通常,您通常需要鎖定單個調用列表或映射的更多內容。

在我看來,只有你需要Collection本身才能保證線程安全:

  • 如果從類外部可以看到集合(公共或默認范圍)
  • 如果您從方法返回集合的句柄
  • 如果集合是您的類的靜態成員

所有這些都可能是一個設計明智的壞主意。

更好的方法是使集合本身成為私有或受保護,並通過同步方法訪問它。 對於靜態成員,如果您需要這樣做,Singleton將是更好的方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM