我正在查看Collections.synhronizedMap()的Java代码。我发现它有以下实现方式。现在我的问题是:
1)为什么我们要使用synchronized(mutex)
2)如果我们使用synchronized(m)会怎样
我的理解是,如果我们使用synchronized(m),那么仍然只有一个线程能够访问该映射表。
static class SynchronizedMap<K, V> implements Map<K, V>, Serializable {
private static final long serialVersionUID = 1978198479659022715L;
private final Map<K, V> m;
final Object mutex;
SynchronizedMap(Map<K, V> map) {
m = map;
mutex = this;
}
SynchronizedMap(Map<K, V> map, Object mutex) {
m = map;
this.mutex = mutex;
}
public void clear() {
synchronized (mutex) {
m.clear();
}
}
public boolean containsKey(Object key) {
synchronized (mutex) {
return m.containsKey(key);
}
}
public boolean containsValue(Object value) {
synchronized (mutex) {
return m.containsValue(value);
}
}
public Set<Map.Entry<K, V>> entrySet() {
synchronized (mutex) {
return new SynchronizedSet<Map.Entry<K, V>>(m.entrySet(), mutex);
}
}
@Override
public boolean equals(Object object) {
synchronized (mutex) {
return m.equals(object);
}
}
编辑:我希望有一些澄清,这也与此问题相关
1)Java 的this关键字用于引用其所在方法的当前实例。因此,如果我在此关键字上放置互斥锁,这是否意味着我们将锁定对象的当前实例,还是将锁定线程的当前实例?如果有人能够更全面地解释以下语句的含义,我将不胜感激。
mutex = this;
SynchronizedMap
(如上所示)从上下文中剥离出来,它就不是一个好的设计示例。没有上下文,这个类的私有字段似乎引用了一个可变对象,这个对象可能会被其他类中的代码修改。通常情况下,这是不好的设计,但如果这个类被隐藏在一个模块中,并且永远不允许以这种特定的方式使用它,那么这可能是可以接受的。 - Solomon Slow