java的volatile
what:
volatile 是 Java 中的关键字,是一个变量修饰符,被用来修饰会被不同线程访问和修改的变量。
why:
1、可见行:
多个线程访问同一个变量时,其中一个线程修改了该变量的值,其它线程能够立即看到修改的值。
在 Java 内存模型中,所有的变量都存储在主存中,同时每个线程都拥有自己的工作内存,用于提高访问速度。线程会从主存中拷贝变量值到自己的工作内存中,然后在自己的工作线程中操作变量,而不是直接操作主存中的变量,由于每个线程在自己的内存中都有一个变量的拷贝,就会造成变量值不一致的问题。
how:使用 volatile 修饰的变量确保了线程不会将该变量拷贝到自己的工作线程中。
2、原子性:
volatile 只保证单次读/写操作的原子性,对于多步操作,volatile 不能保证原子性。
例如:“count++” 是一个复合操作,包括三个部分:读取 count 的值;对 count 加 1;将 count 的值写回内存; volatile 对于这三步操作是无法保证原子性的,所以vloatile 并不能解决所有同步的问题。
3、有序性:
在 Java 内存模型中,允许编译器和处理器对指令进行重排序,重排序过程不会影响到单线程程序的执行,但是会影响到多线程并发执行的正确性。volatile 关键字可以禁止指令重新排序,可以保证一定的有序性。
有序性有两层含义:
a、所有在 volatile 修饰的变量写操作之前的写操作,将会对随后该 volatile 修饰的变量读操作之后的语句可见;
b、禁止 JVM 重排序:volatile 修饰的变量的读写指令不能和其前后的任何指令重排序,其前后的指令可能会被重排序。