《併發編程》--15.線程安全的HashMap

衆所周知,HashMap是線程不安全的。但是如果需要一個線程按鈕的HashMap我們需要怎麼做的。

其中一個可行的辦法就是Collections.synchronizedMap。如下代碼就是線程安全的HashMap

public static Map m = Collections.synchronizedMap(new HashMap<>());
說白了,就是給HashMap加鎖,jdk參考代碼如下

public static <K,V> Map<K,V> synchronizedMap(Map<K,V> m) {
        return new SynchronizedMap<>(m);
    }

    /**
     * @serial include
     */
    private static class SynchronizedMap<K,V>
        implements Map<K,V>, Serializable {
        private static final long serialVersionUID = 1978198479659022715L;

        private final Map<K,V> m;     // Backing Map
        final Object      mutex;        // Object on which to synchronize

        SynchronizedMap(Map<K,V> m) {
            this.m = Objects.requireNonNull(m);
            mutex = this;
        }
}

這個包裝的HashMap可以滿足線程安全的要求。但是,他在高併發的環境中性能表現的不好,無論是對Map的讀取或者寫入,都需要獲得munex的鎖,這會導致其他的的線程進入等待的狀態。如果併發級別不高,一般也夠用。但是在高併發的環境中,我們必須尋求新的解決方案。
一個更加專業的HashMap就是ConcurrentHashMap,他專門爲併發進行了優化。

有關ConcurrentHashMap的實現細節,可以參考下面鎖的優化。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章