Volatile
Java语言提供了一种稍弱的同步机制,即volatile变量,用来确保将变量的更新操作通知到其他线程。当把变量声明为volatile类型后,编译器与运行时都会注意到这个变量是共享的,因此不会将该变量上的操作与其他内存操作一起重排序。volatile变量不会被缓存在寄存器或者对其他处理器不可见的地方,因此在读取volatile类型的变量时总会返回最新写入的值。
volatile详情:https://www.cnblogs.com/zhengbin/p/5654805.html
简单理解,多个线程访问同一变量,当其中一个线程修改后,其他线程能实时接收到修改后的值。
案例:
public class VolatileDemo {
static boolean bool = true;
public static void print() {
System.out.println("print start");
while(bool) {}
System.out.println("print end");
}
public static void main(String[] args) throws InterruptedException {
new Thread(new Runnable() {
@Override
public void run() {
print();
}
}).start();
Thread.sleep(1000);
VolatileDemo.bool = false;
}
}
结果分析:
程序不会打印”m end“,并且程序没有结束,说明在新线程中bool变量获取的还是缓存中的值,并没有实时刷新。
使用Volatile
程序打印”m end“,并且程序结束,说明在新线程中bool变量的值重新获取,而不是在缓存中获取。
static volatile boolean bool = true;
结果分析: