![](/img/trans.png)
[英]HashMap is not synchronized then why concurrentmodification exception
[英]Why are classes such as ArrayList and HashMap not synchronized?
我正在更新一個舊項目,並且想知道是否應該刪除IDE中標記為“過時”的一些對象。 有問題的對象是Vector和Hashtable。 我已經進行了一些研究,似乎這些對象的較新版本-ArrayList和HashMap-基本相同,只是未同步。
我的問題是,為什么我要切換? 我不是只是為了降低速度而只是從應用程序中刪除了一些安全性嗎? 似乎這都不是一個重大的決定,但我想我應該看看在作出決定之前是否值得。
謝謝!
我不是只是為了降低速度而只是從應用程序中刪除了一些安全性嗎?
如果您唯一的線程安全性依賴於Vector
和Hashtable
的同步,那么幾乎肯定會遇到麻煩。
通常,較粗粒度的操作需要同步-幾乎不需要使用“同步集合中的每個小操作,並希望足夠好”的方法,那么為什么要花點錢呢?
如果要在線程之間共享可變數據(例如集合),則需要仔細考慮如何做-使用Vector
和Hashtable
會給您帶來虛假的安全感。
我不是100%地確定您正在獲得自己認為的“安全性”。 我通常發現我想自己進行同步,而不是依靠內置的東西(無論是Vector / Hashtable還是Collections.synchronizedList(new ArrayList())/ Collections.synchronizedMap(new HashMap())) 。
我傾向於創建自己的鎖監視器並自己控制所有鎖。 如果我不這樣做,我往往會忘記鎖定復雜的多步操作,而不會注意到它。 我喜歡它如何迫使您考慮系統中的鎖定-否則,實際上並非如此,變得很容易“感覺”安全。 如果您做的不對,那么鎖定實際上會把您弄得一團糟,並且是一大堆錯誤。 值得額外考慮的是將鎖定放在需要的地方,並了解鎖定如何保護自己。
同步了Java API的早期類,例如Vector
, Hashtable
和StringBuffer
,使它們成為線程安全的。 不幸的是,即使使用單個線程中的這些集合,同步也會對性能產生很大的負面影響。
最好使用其新的非同步替代品:
ArrayList
或LinkedList
而不是Vector
Deque
而不是Stack
HashMap
而不是Hashtable
StringBuilder
而不是StringBuffer
代碼示例
Vector empList = new Vector();
解
ArrayList empList = new ArrayList();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.