【发布时间】:2015-03-11 04:05:37
【问题描述】:
我正在查看 Collections.synhronizedMap() 的 java 代码。我发现它有以下实现。现在我的问题是 1) 我们为什么要使用同步(互斥) 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;
【问题讨论】:
标签: java multithreading mutex