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 我应该应用什么样的修改才能使这个循环永久化?_Java_Multithreading_Concurrency_Thread Safety - Fatal编程技术网

Java 我应该应用什么样的修改才能使这个循环永久化?

Java 我应该应用什么样的修改才能使这个循环永久化?,java,multithreading,concurrency,thread-safety,Java,Multithreading,Concurrency,Thread Safety,我想向自己演示在不使用任何同步的情况下从多个线程访问变量时的可见性线程安全问题 我从以下位置运行此示例: 如何使它永远循环,而不是每次运行时都打印42(永远循环意味着ready=true;ReaderThread线程中变量的修改对main线程不可见) 放置Thread.sleep()调用20秒将会发生的是JIT将在这20秒内启动,它将优化检查并缓存值或完全删除条件。因此代码在可见性上会失败 要阻止这种情况发生,必须使用volatile 放置Thread.sleep()调用20秒将会发生的是JIT

我想向自己演示在不使用任何同步的情况下从多个线程访问变量时的
可见性
线程安全问题

我从以下位置运行此示例:

如何使它永远循环,而不是每次运行时都打印
42
(永远循环意味着
ready=true;
ReaderThread线程中变量的修改对
main
线程不可见)

放置
Thread.sleep()
调用20秒将会发生的是JIT将在这20秒内启动,它将优化检查并缓存值或完全删除条件。因此代码在可见性上会失败

要阻止这种情况发生,必须使用
volatile

放置
Thread.sleep()
调用20秒将会发生的是JIT将在这20秒内启动,它将优化检查并缓存值或完全删除条件。因此代码在可见性上会失败


要阻止这种情况发生,您必须使用
volatile

这真的运行了42次吗?检查这个问题:这真的运行了42次吗?检查这个问题:@tarrsalah可能重复,请尝试增加sleep的值,并检查您的应用程序中是否未禁用JIT编译。@tarrsalah try增加sleep的值,并检查应用程序中是否未禁用JIT编译。
public class NoVisibility {

    private static boolean ready;
    private static int number;

    private static class ReaderThread extends Thread {

        @Override
        public void run() {
            while (!ready) {
                Thread.yield();
            }
            System.out.println(number);
        }
    }

    public static void main(String[] args) throws InterruptedException {
        new ReaderThread().start();
        number = 42;
        ready = true;
    }
}
public static void main(String[] args) throws InterruptedException {
    new ReaderThread().start();
    number = 42;
    //put this over here and program will exit
    Thread.sleep(20000);
    ready = true;
}