2012-06-20 92 views
1

我正在更新一箇舊項目,我想知道是否應該刪除IDE中標記爲「過時」的一些對象。有問題的對象是Vector和Hashtable。我已經做了一些研究,似乎這些對象的新對應物 - ArrayList和HashMap - 基本上是相同的,只是沒有同步化。爲什麼像ArrayList和HashMap這樣的類不同步?

我的問題是,我爲什麼要進行切換?難道我不是從我的應用程序中拿走一點安全性來換取少量速度?似乎這不是一個巨大的決定,但我認爲我會看到是否值得花時間做出決定。

謝謝!

+3

如果這些對象不會被多線程/併發代碼所觸及,那麼您可能不需要同步(因此,您不會因'synchronized'塊導致可能的性能損失)。 Java API中不推薦/廢棄'Vector'和'Hashtable',您可以在它們之間或它們的非同步對象(它們分別公開相同的接口)之間進行選擇。同樣,在Java 5和更新的版本中,您可以訪問'java.util.concurrent',如果您需要併發訪問容器,則可能具有更好的執行容器。 – birryree

+2

如果需要,你總是可以用'Collections.synchronizedList();'來包裝它,但是首先看到Jon的答案 – Attila

回答

9

難道我不是從我的應用程序中拿走一點安全性來換取少量速度?

如果你唯一的線程安全性是依靠VectorHashtable同步,你幾乎可以肯定麻煩了。

通常,粗粒度的操作需要同步 - 「同步集合上的每個小操作並希望是足夠好的」方法幾乎從不需要,所以爲什麼要採用小操作?

如果您在線程之間共享可變數據(例如集合),則需要仔細考慮如何謹慎使用 - 使用VectorHashtable會給您一種錯誤的安全感。

+1

AFAIK有['java.util.concurrent.ConcurrentHashMap'](http://docs.oracle.org/)。com/javase/6/docs/api/java/util/concurrent/ConcurrentHashMap.html)作爲同步Map實現的替代方案。 –

+0

如果寫入次數較少,則CopyOnWriteArrayList會很有用。 –

2

​​會導致嚴重的性能損失,並且往往不是實現併發性的最佳方法。

如果您需要線程安全的集合,請使用java.util.concurrent中的集合。

This article可能會有所幫助。

+0

感謝您的文章! – FreakinOutMan

1

我並不是100%確定您正在獲得您認爲您的「安全」。我通常發現我想自己做同步而不是依靠內置的東西(可以是Vector/Hashtable或Collections.synchronizedList(new ArrayList())/ Collections.synchronizedMap(new HashMap())) 。

我傾向於更喜歡創建自己的鎖定監視器並控制自己的所有鎖定。如果我不這樣做,我傾向於忘記鎖定複雜的多步驟操作而不注意它。我喜歡它如何強迫你考慮系統中的鎖定 - 否則當事實上你沒有時,它很容易'感覺'安全。鎖定是一件事情,如果你做得不對,你可能會把你弄得一團糟,併成爲一個錯誤的巢穴。值得額外考慮的是將鎖定放在需要的位置,並瞭解鎖定如何保護您自己。