volatile:可见性、不能保证原子性(数据不安全)、禁止指令重排
可见性:多线程修改共享内存的变量的时候,修改后会通知其他线程修改后的值,此时其他线程可以读取到修改后变量的值。
指令重排:源代码的代码顺序与编译后字节码指令的执行顺序不一致。
下面通过一个案例说明一下可见性:
public class VolatileDemo {
public static void main(String[] args) {
Demo demo = new Demo();
new Thread(new Runnable() {
@Override
public void run() {
try {
TimeUnit.SECONDS.sleep(3);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
demo.add60();
System.out.println(Thread.currentThread().getName() + "修改变量的值为: " + demo.a);
}
},"AAA").start();
while (demo.a == 0){
//main线程一直等待,直到a被修改为60
}
//如果a不用volatile修饰,main线程会一直等待下去,因为a不会被修改
System.out.println(Thread.currentThread().getName() + "获取变量的值为: " + demo.a);
}
}
class Demo{
volatile int a = 0;
public void add60(){
a = 60;
}
}