Java happens-before 关系?
Java happens-before relationship?
考虑以下代码。
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()
,不应该有任何happens-before关系。我知道不能保证线程 B 看到线程 A 所做的更改。但是有没有可能这个程序的输出是:
running1: true
running2: false
是的,这是可能的,因为它没有被明确禁止。
读取 running
以分配给 running1
和 running2
可以以任何顺序发生,并且读取 running2
可以发生在第一个 System.out.println
之后。并且没有什么可以说读取应该来自缓存或主内存。
基本上,它对可以打印的内容(以及为什么)非常开放。
考虑以下代码。
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()
,不应该有任何happens-before关系。我知道不能保证线程 B 看到线程 A 所做的更改。但是有没有可能这个程序的输出是:
running1: true
running2: false
是的,这是可能的,因为它没有被明确禁止。
读取 running
以分配给 running1
和 running2
可以以任何顺序发生,并且读取 running2
可以发生在第一个 System.out.println
之后。并且没有什么可以说读取应该来自缓存或主内存。
基本上,它对可以打印的内容(以及为什么)非常开放。