当我们在Collections.synchronizedMap()中传递哈希表时会发生什么

Buz*_*zer 6 java collections spring

今天我在采访中提出了一个问题.问题是Collections.synchronizedMap()用于同步地图,默认情况下不像hashmap那样是线程安全的.他的问题是,我们可以在这个方法中传递任何类型的地图.那么当我们在此方法中传递哈希表时会产生什么影响,因为哈希表默认是同步的.

Nat*_*tix 3

映射的行为将是相同的,但性能会受到影响,因为每个方法将获取两个同步锁,而不是一个。

例如,考虑size()在结果地图上调用该方法。类中的实现Collections.SynchronizedMap如下所示:

public int size() {
    synchronized(mutex) {return m.size();} // first lock
}
Run Code Online (Sandbox Code Playgroud)

...其中,m.size()调用实现Hashtable

public synchronized int size() { // second lock
    return count;
}
Run Code Online (Sandbox Code Playgroud)

第一个锁定对象是mutex中的字段SynchronizedMap。第二个锁是隐式的——Hashtable实例本身。