Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 已同步和未同步写入程序到HashMap-结果不符合预期_Java_Multithreading_Synchronized - Fatal编程技术网

Java 已同步和未同步写入程序到HashMap-结果不符合预期

Java 已同步和未同步写入程序到HashMap-结果不符合预期,java,multithreading,synchronized,Java,Multithreading,Synchronized,我遇到过一些代码,这些代码没有正确地同步对映射的访问,但是我分析了非同步代码的影响,结果并不像我预期的那样 本质上,代码有多个写入线程,这些线程写入HashMap perAccountMap。此代码已正确同步 但是,有一段代码由一个单独的线程调用,该线程读取映射并重置它: // Unsynchronized code :( - called from a single thread - reads Map and resets it public static Map<PDKey,

我遇到过一些代码,这些代码没有正确地同步对映射的访问,但是我分析了非同步代码的影响,结果并不像我预期的那样

本质上,代码有多个写入线程,这些线程写入HashMap perAccountMap。此代码已正确同步

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

// 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;
    }
//未同步的代码:(-从单个线程调用-读取映射并重置它
公共静态映射copyAndClearPerAccountMap()
{
Map copyMap=perAccountMap;
perAccountMap_U8;=新HashMap();
返回copyMap;
}
现在,我能够独立验证上面复制到一些多核盒子上的地图内容。 直觉上,我认为上面的copyMap低估了映射中的条目——也就是说,因为它没有同步,所以其他同步写入线程插入到映射中的内容不一定对获取其副本的单个线程可见。 然而,情况似乎正好相反——上面的副本似乎始终多了约1%的条目。
我可以修复未同步的代码,但我不理解我观察到的结果。

我能提供的最佳理论是,在更改后的一小段时间内,编写器线程仍在写入原始映射。如果
perAccountMap\uuu
不是易变的,因为
copyAndClear
方法不会立即被其他线程看到。

我不明白。你不是在复制映射,而是在复制引用。你能重新表述你看到的行为或发布代码来复制它吗?对不起,我的错误-是的,复制courseYes的引用是合理的。现在,非同步线程每15分钟启动一次(ScheduledExecutorService)创建新映射,同时同步线程每秒运行多次。但新映射不会写入原始映射。它不会写入原始映射,但不同的写入线程可能会同时写入原始映射和新映射。