volatile
volatile 是一个关键字,可以修饰类的成员变量、类的静态成员变量,主要有两个功能
第一:保证了不同线程对这个变量进行操作时的可见性,即一个线程修改了某个变量的值,这新值对其他线程来说是立即可见的,volatile关键字会强制将修改的值立即写入主存。
第二: 禁止进行指令重排序,可以保证代码执行有序性。底层实现原理是,添加了一个内存屏障,通过插入内存屏障禁止在内存屏障前后的指令执行重排序优化
可见性
只要给data这个变量在定义时加一个volatile,就可以解决可见性的问题。
第一、data变量定义时加了volatile修饰,那么线程A只要修改data变量的值,就会在修改完自己本地工作内存的data变量之后,强制将这个data变量最新的值刷回主内存,必须让主内存里的data变量值立马变成最新的值。
第二、如果此时别的线程的工作内存中有这个data变量的本地缓存,也就是一个变量的副本,那么会强制让其他线程的工作内存中的data变量缓存直接失效过期,不允许再次读取和使用。
第三、如果线程B在代码运行过程中再次需要读取data变量值时,此时尝试从本地工作内存中读取,就会发现data已经过期。此时,就必须重新从主内存中加载data变量最新的值。