Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.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 为什么在我的macbook pro中,多线程中没有Visiability变量始终可以得到一个结果;_Java_Multithreading - Fatal编程技术网

Java 为什么在我的macbook pro中,多线程中没有Visiability变量始终可以得到一个结果;

Java 为什么在我的macbook pro中,多线程中没有Visiability变量始终可以得到一个结果;,java,multithreading,Java,Multithreading,为什么在我的macbook pro中,多线程中没有Visiability变量始终可以得到一个结果 public class NoVisiability { private int count = 1; private boolean ready = false; public void read() { if (ready) { count = count * 3; } System.out.pr

为什么在我的macbook pro中,多线程中没有Visiability变量始终可以得到一个结果

public class NoVisiability  {
    private int count = 1;
    private boolean ready = false;

    public void read() {
        if (ready) {
            count = count * 3;
        }
        System.out.printf("the count is %s", count);
    }

    public void write() {
        count = 2;
        ready = true;
    }

    public static void main(String[] args) {
        NoVisiability noVisiability = new NoVisiability();
        noVisiability.new ReaderThread(true).start();
        noVisiability.new ReaderThread(false).start();
    }

    private class ReaderThread extends Thread {
        private boolean flag;

        public ReaderThread(boolean flag) {
            this.flag = flag;
        }

        @Override
        public void run() {
            if (flag)
                write();
            else
                read();
        }
    }
}      
共享变量可以重新排序; 结果可以是6,0,3;
但是我运行了很多次,结果总是6

可能是Mac中的JVM决定在同一个线程中执行所有操作。第一个线程很可能在第二个线程开始之前完成

为了加强并发性,我建议使用这个类


您可以创建一个count=1的线程,在“public void run”的第一行等待,并在创建和启动两个线程后触发它。

您的问题很难理解。请提供有关您共享的代码的更多信息,例如它的功能、预期输出以及实际输出。很可能您的写线程在读线程开始之前就已经完成了。它可能也在同一个处理器上运行。