我有一个Java线程安全的地图存储字符串对象映射:以下实现线程安全吗?
ConcurrentHashMap<String, MyObject> map = new ConcurrentHashMap<>();
这里MyObject的是用户定义的类。现在考虑下面的方法:
public void replace(String key, MyObject o) {
MyObject m = map.get("somekey");
synchronized(m) {
// Modify some internal components of m
// and some other objects related to m
}
}
我的目的是在这里我想不把锁在全班但只能在线程试图访问地图相同的密钥,以最大限度地提高性能。基本上每次在地图中替换一个条目(不添加),这部分代码就会被执行。喜欢的东西:
public void put(String key, MyObject o) {
if (map.putIfAbsent(key, o) == null){ //do something
}
else {
replace(key, o);
}
}
从实际出发,我们可以认为这是通过为myObject一个参考是可以改变的唯一方法。这个实现线程安全吗?
这是不可能知道没有'MyObject'的实现,并且if有可能以另一种方式访问这个特定的实例。但简单的答案是:可能不是。 –
@MarkRotteveel我同意我的问题不完整。我现在添加了更多的细节。 – Sohaib
我迷路'replace'和'put'都在你的代码中? –