volatile:可见性、不能保证原子性(数据不安全)、禁止指令重排
可见性:多线程修改共享内存的变量的时候,修改后会通知其他线程修改后的值,此时其他线程可以读取到修改后变量的值。
指令重排:源代码的代码顺序与编译后字节码指令的执行顺序不一致。
下面通过一个案例说明一下可见性:
public class VolatileDemo {public static void main(String[] args) {Demo demo = new Demo();new Thread(new Runnable() {@Overridepublic 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;}
}