try {
Thread.sleep(3000);
} catch (InterruptedException ignore) {
}
vt.sign = true;
System.out.println(“vt.sign = true 通知 while (!sign) 结束!”);
}
});
Thread01.start();
Thread02.start();
}
}
class VT implements Runnable {
public boolean sign = false;
public void run() {
while (!sign) {
}
System.out.println(“你坏”);
}
}
这段代码,是两个线程操作一个变量,程序期望当 sign
在线程 Thread01 被操作 vt.sign = true
时,Thread02 输出 你坏。
但实际上这段代码永远不会输出 你坏,而是一直处于死循环。这是为什么呢?接下来我们就一步步讲解和验证。
2. 加上volatile关键字
我们把 sign 关键字加上 volatitle 描述,如下:
class VT implements Runnable {
public volatile boolean sign = false;
public void run() {
while (!sign) {
}
System.out.println(“你坏”);
}
}
测试结果
vt.sign = true 通知 while (!sign) 结束!
你坏
Process finished with exit code 0
volatile关键字是Java虚拟机提供的的最轻量级的同步机制,它作为一个修饰符出现,用来修饰变量,但是这里不包括局部变量哦
在添加 volatile 关键字后,程序就符合预期的输出了 你坏。从我们对 volatile 的学习认知可以知道。volatile关键字是 JVM 提供的最轻量级的同步机制,