gpt4 book ai didi

java - HashMap 的同步和不同步写入器 - 结果不符合预期

转载 作者:行者123 更新时间:2023-11-30 04:04:06 28 4
gpt4 key购买 nike

我遇到过无法正确同步对 map 的访问的代码 - 但是我分析了非同步代码的影响,结果并不符合我的预期。

本质上,代码有多个编写器线程写入 HashMap perAccountMap_ 此代码已正确同步。

但是,有一段代码由单独的线程调用,该线程读取 map 并重置它:

// Unsynchronized code :( - called from a single thread - reads Map and resets it
public static Map<PDKey, PData> copyAndClearPerAccountMap()
{
Map<PDKey, PData> copyMap = perAccountMap_;
perAccountMap_ = new HashMap<PDKey, PData>();
return copyMap;
}

现在,我能够独立验证上面在一些多核机器上复制的 map 的内容。直观上,我预计上面的 copyMap 会低估 Map 中的条目 - 即,因为它没有同步,所以其他同步写入器线程插入到 Map 中的操作不一定对获取其副本的单个线程可见。然而,情况似乎恰恰相反——上面的副本似乎始终有约。条目增加 1%。我可以修复不同步的代码,但我不明白我观察到的结果。

最佳答案

我能提供的最好的理论是,编写器线程在更改后的短时间内仍在原始映射中写入。如果 perAccountMap_ 不是 volatile 的,则尤其可能发生这种情况,因为其他线程不会立即看到 copyAndClear 方法所做的更改。

关于java - HashMap 的同步和不同步写入器 - 结果不符合预期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21188564/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com