- 我们可以这样将线程不安全的容器转化为线程安全的。
Collections.synchronizedMap(new HashMap<>());
Collections.synchronizedList(new LinkedList<>());
Collections.synchronizedSet(new TreeSet<>());
- 为什么会这么神奇,看看synchronizedMap源码:
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) {
if (m==null)
throw new NullPointerException();
this.m = m;
mutex = this;
}
SynchronizedMap(Map<K,V> m, Object mutex) {
this.m = m;
this.mutex = mutex;
}
public int size() {
synchronized (mutex) {return m.size();}
}
应该很清楚了:
- 1.所有的map操作,都委托给传进去的map。
- 2.同时对map操作进行加锁,即只有获得mutex这个对象的锁的线程,才可以访问,这样就保证了线程安全。
网友评论