如果多个线程使用公共方法读取特定键的值,我们是否需要在私有静态 Map 对象上进行同步?

普拉文·拉瓦特

如果多个线程正在使用首先检查具有给定键的值的方法,如果未找到,则在对象上放置具有该键的新对象,我们是否需要对象上进行同步private static MapgetObjectmapmap

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;
}
戴维xxx

你不只是阅读。您也将值放入映射中,并且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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

Related 相关文章

热门标签

归档