首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java强制易失性访问

Java强制易失性访问
EN

Stack Overflow用户
提问于 2018-01-15 19:21:19
回答 4查看 146关注 0票数 3

考虑一下这样的情况。

有两个线程和一个共享资源(如HashMap)。一个线程创建了HashMap并使用一些键值对对它进行了初始化,并且在初始化共享资源之后,它将不再被修改。

现在,第二个线程是在初始化共享资源并希望使用该资源之后严格创建的。此时,我希望能够保证第二个线程将使用共享资源的正确版本。我假设第一个线程可能在创建第二个线程之前没有刷新对主内存的更改,所以第二个线程将把共享资源的旧值带到它的缓存中。

这一分析是否正确,以及如何在初始化共享资源之后,强制在Java中手动刷新主内存,就像我不想要或者不需要volatilesynchronized的特殊情况一样。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2018-01-15 19:29:58

文献资料说:

在启动线程中的任何操作之前,都会发生对线程启动的调用。

所以,如果你的代码符合你的描述,它是安全的。

票数 4
EN

Stack Overflow用户

发布于 2018-01-15 19:26:16

如果您将您的HashMap声明并初始化为静态字段,那么它将由Java加载器以线程安全的方式初始化。

票数 1
EN

Stack Overflow用户

发布于 2018-01-15 19:31:26

如果地图初始化发生在第二个线程开始之前,那么一切都是正确的。为了简化分析和简化,您可以将不初始化的映射转换为一些不可变的映射实现,并显式地将其传递给创建的线程。这样您就根本不需要使用共享变量了。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48269411

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档