volatile 关键字无法在 java 中停止循环
volatile keyword can't stop loop in java
public class VolatileOne {
private static boolean ready ;
private static int number ;
private static class ReaderThread extends Thread{
@Override
public void run() {
while (!ready){
Thread.yield();
}
System.out.print(number);
}
}
public static void main(String[] args) {
new ReaderThread().run();
ready = true;
number = 50;
}
}
在运行这段代码之后,程序并没有停止,这是显而易见的,因为线程将准备好的变量备份到自己进程的内存中。当我使用 volatile 关键字修改 read
private volatile static boolean ready ;
此时不会将读取的变量复制到进程内存中。但是程序不能停止。什么原因?是否与static关键字有关?
如果你想让程序输出50和return,你应该怎么做?
您需要调用start
在另一个线程中执行代码。检查 this 以了解 run
和 start
之间的区别。
调用 join
等待 ReaderThread
完成。
volatile
关键字可以在写线程和读线程之间建立happens-before关系,可以把number = 50;
放在ready = true;
之前,这使得确保 reader 会注意到 number
是 50
当它注意到 ready
是 true
.
示例:
Thread reader = new ReaderThread();
reader.start();
number = 50;
ready = true;
reader.join();
public class VolatileOne {
private static boolean ready ;
private static int number ;
private static class ReaderThread extends Thread{
@Override
public void run() {
while (!ready){
Thread.yield();
}
System.out.print(number);
}
}
public static void main(String[] args) {
new ReaderThread().run();
ready = true;
number = 50;
}
}
在运行这段代码之后,程序并没有停止,这是显而易见的,因为线程将准备好的变量备份到自己进程的内存中。当我使用 volatile 关键字修改 read
private volatile static boolean ready ;
此时不会将读取的变量复制到进程内存中。但是程序不能停止。什么原因?是否与static关键字有关?
如果你想让程序输出50和return,你应该怎么做?
您需要调用
start
在另一个线程中执行代码。检查 this 以了解run
和start
之间的区别。调用
join
等待ReaderThread
完成。volatile
关键字可以在写线程和读线程之间建立happens-before关系,可以把number = 50;
放在ready = true;
之前,这使得确保 reader 会注意到number
是50
当它注意到ready
是true
.
示例:
Thread reader = new ReaderThread();
reader.start();
number = 50;
ready = true;
reader.join();