volatile 关键字是最常问到的问题,关于这个关键字的作用解释,网上的文章已经多如牛毛了。
简短的总结一下,主要解决 2 个问题。
编译器会自作主张的对代码顺序优化,尽管这种优化在大多数场合都是有效的,但是在多线程环境下可能导致不一致的问题。
volatile 修饰的变量,进行写操作时,这个变量将会被直接写入共享内存,而不是线程中缓存。volatile 变量读操作时,直接从共享内存中读,而不是从线程的缓存中读取,保证线程每次读到的都是最新值。也就是保证了内存可见性。
Java 中,long 和 double 都是 64 位的,因此在对于 32 位的操作系统,读写 long 和 double 数据类型会进行 2 次操作,先读写 32 位,再读写 32 位。在多线程情况下,可能读写到一半,这个数值就被使用,导致程序异常。而 volatile 修饰的 long,double 类型,可以保证必须 2 次操作都完成后才可进行下一步操作。某种程度上就是保证了 long,double 数据读写的原子性。