首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JMM和发生-之前

JMM和发生-之前
EN

Stack Overflow用户
提问于 2016-07-24 06:17:09
回答 1查看 162关注 0票数 1

我有一个关于JMM的问题。我知道“之前发生”是什么意思,但我不明白一件事。这里有一个代码:

代码语言:javascript
复制
private static int x = 0;
private static volatile boolean flag = false;

public static void main(String[] args) throws InterruptedException {

    new Thread(() -> {
        x = 10;
        while (!flag) ;
        System.out.println(x);
    }).start();

    x = 5;
    flag = true;
}

在"X“中必须有什么值,有没有规则来确定它?也许在这种情况下,线程将一些值放在X by中的顺序是什么?

EN

回答 1

Stack Overflow用户

发布于 2017-02-17 15:13:24

让我们首先通过注释掉x=10来稍微简化一下程序。

代码语言:javascript
复制
private static int x = 0;
private static volatile boolean flag = false;

public static void main(String[] args) throws InterruptedException {

    new Thread(() -> {
        //x = 10;
        while (!flag) ;
        System.out.println(x);
    }).start();

    x = 5;
    flag = true;
}

在本例中,将打印5。为什么?

代码语言:javascript
复制
x=5
|
[program order rule]
|
flag=true
|
[volatile variable rule]
|
tmp1=flag
|
[program order rule]
| 
tmp2=x

因为在规则之前发生也是可传递的,所以在x=5和tmp2=x之间有一个在此之前发生的关系。

如果x=10是未注释的,则10和5是允许的结果。

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

https://stackoverflow.com/questions/38546897

复制
相关文章

相似问题

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