1

考虑以下代码。

public class Test {
    private boolean running = false;

    public void run() {
        running = true;
    }

    public void test() {
        boolean running1 = running;
        boolean running2 = running;
        System.out.println("running1: " + running1);
        System.out.println("running2: " + running2);
    }
}

线程 A 调用run(),然后另一个线程 B 调用test()并且不应该有任何发生之前的关系。我知道不能保证线程 B 看到线程 A 所做的更改。但是这个程序的输出是否有可能是:

running1: true
running2: false
4

1 回答 1

5

是的,这是可能的,因为它没有被明确禁止。

读取runningfor 分配到running1running2可以以任何顺序相互关联,读取 forrunning2可能发生在第一个 之后System.out.println。没有什么可以说读取应该来自缓存或主内存。

基本上,它对于可以打印的内容(以及为什么)非常开放。

于 2020-06-22T20:48:27.897 回答