[英]What is the difference between Hashtable and HashMap if both throws ConcurrentModificationException in following code snippet?
在下面的代碼片段中,我嘗試了所謂的線程安全的Hashtable
和HashMap
。 但是在兩種情況下,我都得到了ConcurrentModificationExceptionn
。 如果是這樣,那么在線程安全的情況下, HashTable
對於HashMap
有何優勢?
public class multiThreadedEnv {
static Map<Integer, String> map = new Hashtable<Integer, String>();
//static Map<Integer, String> map = new HashMap<Integer, String>();
static{
map.put(1, "One");
map.put(2, "Two");
map.put(3, "Three");
map.put(4, "Four");
map.put(5, "Five");
}
public static void main(String[] args) {
Thread t1 = new Thread(){
public void run() {
Iterator itr= map.entrySet().iterator();
while(itr.hasNext()){
Entry<String,String> entry=(Entry<String, String>) itr.next();
System.out.println(entry.getKey()+" , "+entry.getValue());
itr.remove();
Thread.sleep(2000);
}
}
};
Thread t2= new Thread(){
public void run() {
Iterator itr= map.entrySet().iterator();
while(itr.hasNext()) {
Entry<String,String> entry=(Entry<String, String>) itr.next();
System.out.println(entry.getKey()+" , "+entry.getValue());
itr.remove();
Thread.sleep(2000);
}
}
};
t1.start();
t2.start();
}
}
Hashtable
是同步的,從而防止兩個線程同時訪問它。
從Java 2平台v1.2開始,對該類進行了改進以實現
Map
接口,使其成為Java Collections Framework的成員。 與新的集合實現不同,Hashtable
是同步的。 如果不需要線程安全的實現,建議使用HashMap
代替Hashtable
。 如果需要線程安全的高度並發實現,則建議使用ConcurrentHashMap
代替Hashtable
。
HashMap
不同步。
請注意,此實現未同步。 如果多個線程同時訪問哈希映射,並且至少有一個線程在結構上修改該映射,則必須在外部進行同步。 (結構修改是添加或刪除一個或多個映射的任何操作;僅更改與實例已經包含的鍵相關聯的值不是結構修改。)
同步不會阻止ConcurrentModificationException
,因為它們都說 :
此類的所有“集合視圖方法”返回的迭代器都是快速失敗的 :如果在創建迭代器后的任何時間都對[Hashtable / map]進行了結構修改,則除了通過迭代器自己的
remove
方法之外,該迭代器都是通過迭代器進行的將拋出ConcurrentModificationException
。
請注意,單個線程可以通過直接更新Hashtable / HashMap並同時對其進行迭代來導致ConcurrentModificationException
。 它不需要多線程即可違反此規則。
迭代器和枚舉返回的元素反映了在創建迭代器/枚舉時或此后某個時刻哈希表的狀態。 他們不拋出
ConcurrentModificationException
。 但是,迭代器被設計為一次只能由一個線程使用。
因此, HashMap
對於單線程訪問很有用。
Hashtable
對於多線程訪問很有用,只要它們不需要迭代映射即可。
ConcurrentHashMap
允許通過多個線程進行更新和迭代。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.