java并发实践16.1
在此代码中:java并发实践16.1,java,multithreading,concurrency,Java,Multithreading,Concurrency,在此代码中: public class PossibleReordering { static int x = 0, y = 0; static int a = 0, b = 0; public static void main(String[] args) throws InterruptedException { Thread one = new Thread(new Runnable() { publ
public class PossibleReordering {
static int x = 0, y = 0;
static int a = 0, b = 0;
public static void main(String[] args)
throws InterruptedException {
Thread one = new Thread(new Runnable() {
public void run() {
a = 1;
x = b;
}
});
Thread other = new Thread(new Runnable() {
public void run() {
b = 1;
y = a;
}
});
one.start(); other.start();
one.join(); other.join();
System.out.println("( "+ x + "," + y + ")");
}
}
他们说Java编译器将对一个线程和另一个线程中的指令重新排序,以优化其执行,并最终导致结果(0,0)
他们还说:线程中的每个动作都发生在该线程中的每个动作之前,该线程中的每个动作都在程序顺序的后面
这两条语句是否相互冲突?发生在之前规则仅适用于相互依赖的语句。由于这些
run()
方法都包含独立的赋值,因此允许编译器对它们重新排序,这可能会导致您描述的输出。您可以阅读Javaspecs中
发生在之前的定义:
应该注意的是,两个动作之间的“先发生后发生”关系的存在并不一定意味着它们必须采取行动
在实现中按该顺序放置。如果重新排序产生
结果与合法执行一致,并不违法
例如,如果第一个run()
方法如下所示:
public void run() {
b = 1;
x = b;
}
不允许重新订购