【问题标题】:Synchronize HashMap in multithreaded environment only for put and remove在多线程环境中同步 HashMap 仅用于 put 和 remove
【发布时间】:2021-06-01 00:50:32
【问题描述】:

我有两个线程共享一个公共的 HashMap,一个线程总是将一个对象插入到 Map 中,第二个线程将从 HashMap 中删除对象。 我的问题是,如果这是两个线程的唯一逻辑,我应该使用同步或 ConcurrentHashMap “保护” Map,我可以有竞争条件吗? 如果是,您能否解释一下不保护地图的风险。

谢谢

【问题讨论】:

    标签: java multithreading concurrency hashmap synchronization


    【解决方案1】:

    我可以有一个竞争条件

    是的,没有同步或ConcurrentHashMap

    Javadoc of HashMap中明确说明:

    请注意,此实现不同步。如果多个线程同时访问一个hash map,并且至少有一个线程在结构上修改了map,则必须对外同步。

    你有两个线程在结构上修改映射,所以如果你使用HashMap,你需要同步。

    请解释不保护地图的风险是什么

    未定义的行为,从做完全错误的事情(最好的未定义行为,因为您知道它需要修复),到 似乎 可以工作,直到您更改 JVM 版本和它神秘地停止工作(最糟糕的未定义行为)。

    【讨论】:

    • 最糟糕的问题是得到看似正确但实际上错误的结果。用HashMaps 来命名竞争条件的另一个众所周知的症状,就是陷入无限循环。但是在不保护地图的情况下,通过地图交换的对象的状态也会受到数据竞争的影响。确实有各种各样的事情可能发生。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-27
    • 1970-01-01
    • 1970-01-01
    • 2015-09-25
    • 1970-01-01
    相关资源
    最近更新 更多