and*_*mur 3 java concurrency multithreading volatility
这里的代码
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();
}
}
Run Code Online (Sandbox Code Playgroud)
在这段代码中我希望看到:
左,右,左右等,
但是当带有"left"消息的Thread变为isOn为false时,带有"right"消息的Thread看不到它,我得到("right true"和"left false"控制台消息),左线程没有得到isOn in true ,但是正确的线程不能改变它,因为它总是看到旧的isOn值(true).
当我向isOn添加volatile修饰符时没有任何变化,但如果我将isOn更改为某个具有布尔字段的类并更改此字段,则线程会看到更改并且它工作正常
提前致谢.
isOn是一个线程局部变量,所以当一个线程修改它时,另一个线程将看不到更改.当你使用带有布尔字段的类时,你可能会给每个线程提供相同的类实例,这意味着线程将看到其他线程所做的更改.但是,您创建两个实例Aux而不是仅使用一个实例.
如果您希望它在两个不同的实例上工作,请尝试将static修饰符(以及volatile修饰符)添加到Boolean字段中; 否则,不要创建第二个Aux.
| 归档时间: |
|
| 查看次数: |
1060 次 |
| 最近记录: |