同步map的學習

首先,先說明map。Map用於存儲「key-value」元素對,它將一個key映射到一個並且只能是惟一的一個value。Map可使用多種實現方式,HashMap的實現採用的是hash表;而TreeMap採用的是紅黑樹。安全

  1. HashTable 和 HashMap的不一樣多線程

    它們都實現了Map接口,但HashTable還實現了Dictionary抽象類。在HashMap中,null能夠做爲鍵也能夠做爲值,因此不能用get方法來判斷map中是否含有見,而是必須用containsKey方法來判斷。而在HashTable中,不管是鍵仍是值,都不能用null。併發

    最大的不一樣則在於HashTable爲線程安全的,它的方法都是同步了的,能夠直接在多線程環境下使用。HashMap則不是線程安全的,在多線程環境下,須要手動實現同步機制。Java中Collections類提供了一個方法用於返回一個同步版本的HashMap以便用於多線程環境中。
spa

 Java代碼線程

  1. public static <K,V> Map<K,V> synchronizedMap(Map<K,V> m) {   指針

  2.     return new SynchronizedMap<K,V>(m);   orm

  3.  }接口

 但這樣返回的SynchronizedMap頁並非時時都線程安全的,好比,在判斷了元素存在以後,進行刪除操做,此時如有另外一個線程頁判斷元素存在,要進行刪除操做是卻發現元素已經不存在了就會拋出異常。進程

2. 更好的選擇:ConcurrentHashMaprem

ConcurrentHashMap提供了一種與HashTable和SynchronizedMap中不一樣的鎖機制。HashTable採用的鎖機制是一次鎖住整個整個hash表,從而同一時刻只能由同一個線程進行操做。而ConcurrentMap則是一次鎖住一個桶,默認將Hash表分爲16個桶。get、put、remove操做只需鎖住最經常使用的桶。如今能夠有16個進程併發執行。而讀操做通常不須要鎖,只有size是需鎖住整個hash表。

在迭代方面,ConcurrentHashMap頁採起了一種新的迭代方式。iterator被建立後在發生改變也不會拋出ConcurrentModificationException異常,而是在改變是new新的數據,從而不影響原有的數據,在迭代完成後再將頭指針替換爲新的數據。這樣讀進程能夠讀取原有數據,而寫進程也能夠併發的改變數據。

相關文章
相關標籤/搜索