繁体   English   中英

如果在下面的代码片段中都抛出ConcurrentModificationException,则Hashtable和HashMap有什么区别?

[英]What is the difference between Hashtable and HashMap if both throws ConcurrentModificationException in following code snippet?

在下面的代码片段中,我尝试了所谓的线程安全的HashtableHashMap 但是在两种情况下,我都得到了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 它不需要多线程即可违反此规则。

ConcurrentHashMap说:

迭代器和枚举返回的元素反映了在创建迭代器/枚举时或此后某个时刻哈希表的状态。 他们抛出ConcurrentModificationException 但是,迭代器被设计为一次只能由一个线程使用。

因此, HashMap对于单线程访问很有用。
Hashtable对于多线程访问很有用,只要它们不需要迭代映射即可。
ConcurrentHashMap允许通过多个线程进行更新和迭代。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM