如果多个线程正在使用首先检查具有给定键的值的方法,如果未找到,则在对象上放置具有该键的新对象,我们是否需要在对象上进行同步。private static Map
getObject
map
map
private static Map<String, Object> map = new HashMap<>();
public Object getObject(String key){
Object obj = map.get(key);
if(obj == null){
obj = new Object();
map.put(key, obj);
}
return obj;
}
你不只是阅读。您也将值放入映射中,并且HashMap
如果其中至少一个在映射上进行了一些写入,则不会设计为与并发线程一起使用。
所有这些都应该同步以避免线程之间的竞争条件:
Object obj = map.get(key);
if(obj == null){
obj = new Object();
map.put(key, obj);
}
竞争条件示例:
对于"a"
未包含在地图中的键,可以在此处暂停线程:
if(obj == null){
另一个线程可以使用键执行代码,"a"
因此将元素放入映射中,因为它仍然未被包含。
当第一个线程恢复时,它会覆盖 key 的映射内容"a"
。
请注意,如果您使用 a ConcurrentHashMap
,则可以使用putIfAbsent()
它确保以原子方式执行操作(如果不退出则检查+放置)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句