考虑一下这样的情况。
有两个线程和一个共享资源(如HashMap)。一个线程创建了HashMap并使用一些键值对对它进行了初始化,并且在初始化共享资源之后,它将不再被修改。
现在,第二个线程是在初始化共享资源并希望使用该资源之后严格创建的。此时,我希望能够保证第二个线程将使用共享资源的正确版本。我假设第一个线程可能在创建第二个线程之前没有刷新对主内存的更改,所以第二个线程将把共享资源的旧值带到它的缓存中。
这一分析是否正确,以及如何在初始化共享资源之后,强制在Java中手动刷新主内存,就像我不想要或者不需要volatile或synchronized的特殊情况一样。
发布于 2018-01-15 19:29:58
发布于 2018-01-15 19:26:16
如果您将您的HashMap声明并初始化为静态字段,那么它将由Java加载器以线程安全的方式初始化。
发布于 2018-01-15 19:31:26
如果地图初始化发生在第二个线程开始之前,那么一切都是正确的。为了简化分析和简化,您可以将不初始化的映射转换为一些不可变的映射实现,并显式地将其传递给创建的线程。这样您就根本不需要使用共享变量了。
https://stackoverflow.com/questions/48269411
复制相似问题