[英]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.