这是代码
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 时,带有“右”消息的线程看不到它,我得到(“右 true”和“左 false”控制台消息),左线程没有将 isOn 设为 true ,但右线程无法更改它,因为它总是看到旧的 isOn 值(true)。
当我向 isOn 添加 volatile 修饰符时,没有任何变化,但是如果我将 isOn 更改为带有布尔字段的某个类并更改此字段,则线程会看到更改并且工作正常
提前致谢。
isOn
是一个线程局部变量,因此当一个线程修改它时,另一个线程将看不到更改。当您使用带有布尔字段的类时,您可能会为每个线程提供该类的相同实例,这意味着线程将看到其他线程所做的更改。但是,您创建了两个实例Aux
而不是只使用一个。
如果您希望它在两个不同的实例上工作,请尝试添加static
修饰符(以及volatile
修饰符)到Boolean
场地;否则,不要创建第二个Aux
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)