加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – 创建新线程有没有刷新缓存的副作用?

发布时间:2020-12-14 05:59:24 所属栏目:Java 来源:网络整理
导读:我想知道在 Java中创建新线程是否会触发缓存刷新.假设我按照以下顺序执行此类操作: 线程运行并设置变量X. 线程创建一个新线程. 新线程访问X. 我的问题是:是新线程,无论是在创建时还是在开始执行时,都保证看到步骤1中旧线程对X进行的更新?我知道如果旧线程
我想知道在 Java中创建新线程是否会触发缓存刷新.假设我按照以下顺序执行此类操作:

>线程运行并设置变量X.
>线程创建一个新线程.
>新线程访问X.

我的问题是:是新线程,无论是在创建时还是在开始执行时,都保证看到步骤1中旧线程对X进行的更新?我知道如果旧线程将来更改X的值,则无法保证新线程将看到这些更改.没关系.我只是想知道新线程在启动时是否会看到正确的值,而不需要显式同步.

当我第一次决定调查这个主题时,我认为一个简单的谷歌搜索会立即显示答案,但由于某种原因,我找不到任何解决这个问题的结果.

解决方法

是的.

在java中,有’before-before’关系,指定两个动作之间可见的记忆效果.如果“A发生在B之前”,则动作B保证看到动作A完成的所有更改.

启动一个线程会在“thread.start()”调用和在新线程上执行的所有代码之间创建“之前发生”关系.因此,保证新线程在第一个线程上看到更改变量X的记忆效应.

有关发生在之前的关系的快速概述,请参阅java.util.concurrent包概述的Memory Visibility部分.在您的情况下,有趣的位是:

>线程中的每个操作都发生在该线程中的每个操作之前,该操作将在程序的后续命令中出现.
>在启动线程中的任何操作之前发生对线程启动的调用.

如果你好奇,可以使用更多链接:

> Java内存模型在Chapter 17 of the Java Language Specification中描述
> Java Memory Model FAQ
> Everything else about JMM

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读