簡體   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