Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/376.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java并发实践16.1_Java_Multithreading_Concurrency - Fatal编程技术网

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;
}
不允许重新订购