簡體   English   中英

為什么ArrayList和HashMap之類的類不同步?

[英]Why are classes such as ArrayList and HashMap not synchronized?

我正在更新一個舊項目,並且想知道是否應該刪除IDE中標記為“過時”的一些對象。 有問題的對象是Vector和Hashtable。 我已經進行了一些研究,似乎這些對象的較新版本-ArrayList和HashMap-基本相同,只是未同步。

我的問題是,為什么我要切換? 我不是只是為了降低速度而只是從應用程序中刪除了一些安全性嗎? 似乎這都不是一個重大的決定,但我想我應該看看在作出決定之前是否值得。

謝謝!

我不是只是為了降低速度而只是從應用程序中刪除了一些安全性嗎?

如果您唯一的線程安全性依賴於VectorHashtable的同步,那么幾乎肯定會遇到麻煩。

通常,較粗粒度的操作需要同步-幾乎不需要使用“同步集合中的每個小操作,並希望足夠好”的方法,那么為什么要花點錢呢?

如果要在線程之間共享可變數據(例如集合),則需要仔細考慮如何做-使用VectorHashtable會給您帶來虛假的安全感。

synchronized會導致嚴重的性能損失,並且通常不是實現並發的最佳方法。

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

本文可能會有所幫助。

我不是100%地確定您正在獲得自己認為的“安全性”。 我通常發現我想自己進行同步,而不是依靠內置的東西(無論是Vector / Hashtable還是Collections.synchronizedList(new ArrayList())/ Collections.synchronizedMap(new HashMap())) 。

我傾向於創建自己的鎖監視器並自己控制所有鎖。 如果我不這樣做,我往往會忘記鎖定復雜的多步操作,而不會注意到它。 我喜歡它如何迫使您考慮系統中的鎖定-否則,實際上並非如此,變得很容易“感覺”安全。 如果您做的不對,那么鎖定實際上會把您弄得一團糟,並且是一大堆錯誤。 值得額外考慮的是將鎖定放在需要的地方,並了解鎖定如何保護自己。

同步了Java API的早期類,例如VectorHashtableStringBuffer ,使它們成為線程安全的。 不幸的是,即使使用單個線程中的這些集合,同步也會對性能產生很大的負面影響。

最好使用其新的非同步替代品:

  • ArrayListLinkedList而不是Vector
  • Deque而不是Stack
  • HashMap而不是Hashtable
  • StringBuilder而不是StringBuffer

代碼示例

Vector empList = new Vector();

ArrayList empList = new ArrayList();

暫無
暫無

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

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