这个问题是我再验证volatile的时候发现的,感觉很诡异,所以就记录一下
首先说一下volatile这个关键字的特性:
1.保证可见性,volatile保证了不同线程对这个变量进行操作时的可见性,即一个线程修改了某个变量的值,这新值对其他线程来说是立即可见的。
2.保证有序性,禁止进行指令重排序,
3.不保证原子性,volatile也无法保证对变量的任何操作都是原子性的
执行一下代码,测试一下volatile关键字
import java.util.concurrent.TimeUnit;
public class VolatileTest {
private static boolean flag = true;
public static void main(String[] args) throws InterruptedException {
new Thread(() -> {
while (flag) {
System.out.println("flag = " + flag);
}
}).start();
//5s之后将flag的值修改为false;
TimeUnit.SECONDS.sleep(5);
new Thread(() -> {
flag =