这里的代码
class Aux implements Runnable {
private Boolean isOn = false;
private String statusMessage;
private final Object lock;
public Aux(String message, Object lock) {
this.lock = lock;
this.statusMessage = message;
}
@Override
public void run() {
for (;;) {
synchronized (lock) {
if (isOn && "left".equals(this.statusMessage)) {
isOn = false;
System.out.println(statusMessage);
} else if (!isOn && "right".equals(this.statusMessage)) {
isOn = true;
System.out.println(statusMessage);
}
if ("left".equals(this.statusMessage)) {
System.out.println("left " + isOn);
}
}
}
}
}
public class Question {
public static void main(String [] args) {
Object lock = new Object();
new Thread(new Aux("left", lock)).start();
new Thread(new Aux("right", lock)).start();
}
}
在这段代码中,我希望看到:
左,右,左,右等等,
但是当带有“左”消息的线程将 isOn 更改为 false 时,带有“右”消息的线程看不到它并且我得到(“右真”和“左假”控制台消息),左线程不会在真中获得 isOn ,但正确的线程无法更改它,因为它总是看到旧的 isOn 值(true)。
当我将 volatile 修饰符添加到 isOn 时,没有任何变化,但是如果我将 isOn 更改为带有布尔字段的某个类并更改此字段,那么线程会看到更改并且它工作正常
提前致谢。