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;
}