我們知道hashMap是非線程安全的,爲了實現線程安全,無非就是以下三種方式:
Hashtable 、ConcurrentHashMap 、SynchronizedMap
這篇文章主要講解SynchronizedMap
是怎麼實現線程安全的
SynchronizedMap用法:
HashMap hashMap = new HashMap<String, String>();
hashMap.put("one", "1");
hashMap.put("two", "2");
Map<String, String> map = Collections.synchronizedMap(hashMap);
Log.e("iterator", map.get("one"));
Log.e("iterator", map.get("two"));
Collections.synchronizedMap(hashMap)
用來創建SynchronizedMap
對象
SynchronizedMap源碼:
// synchronizedMap方法
public static <K,V> Map<K,V> synchronizedMap(Map<K,V> m) {
return new SynchronizedMap<>(m);
}
// SynchronizedMap類
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;
}
SynchronizedMap(Map<K,V> m, Object mutex) {
this.m = m;
this.mutex = mutex;
}
public int size() {
synchronized (mutex) {return m.size();}
}
public boolean isEmpty() {
synchronized (mutex) {return m.isEmpty();}
}
public boolean containsKey(Object key) {
synchronized (mutex) {return m.containsKey(key);}
}
public boolean containsValue(Object value) {
synchronized (mutex) {return m.containsValue(value);}
}
public V get(Object key) {
synchronized (mutex) {return m.get(key);}
}
public V put(K key, V value) {
synchronized (mutex) {return m.put(key, value);}
}
public V remove(Object key) {
synchronized (mutex) {return m.remove(key);}
}
// 省略其他方法
}
可以看到
synchronizedMap
內部所有的方法其實都是執行我們傳入的map
對象的方法,只不過都用synchronized
進行上鎖。這裏就是使用到了java
的代理模式。代理模式可以參考:android開發:設計模式(一):代理模式