其中一個可行的辦法就是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的實現細節,可以參考下面鎖的優化。