让我们来瞧瞧这个api长啥样:
public static <K,V> Map<K,V> synchronizedMap(Map<K,V> m) {
return new SynchronizedMap<>(m);
}
private static class SynchronizedMap<K,V> implements Map<K,V>, Serializable {
SynchronizedMap(Map<K,V> m) {
this.m = Objects.requireNonNull(m);
mutex = this; //锁的是当前的 map 对象
}
// ... 忽略其他方法,我们关注最关键的 put 和 get 方法
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);}
}
}
这已经很明显了,直接锁的当前对象,那效率肯定不高 …
再看看 HashTable 的put 和 get:
public synchronized V put(K key, V value) {
// ...省略
}
public synchronized V get(Object key) {
//... 省略
}
结论
效率比较低下,跟HashTable差不多
可以看到 synchronizedMap 和 HashTable 的锁粒度都是一样的,每次对表进行操作都会把 整个map对象锁起来,这样就会经常造成线程阻塞的状况,虽然线程安全是实现了。。。