一、volatile作用
①保证内存可见性
通俗来说就是,线程A对一个volatile变量的修改,对于其它线程来说是可见的,即线程每次获取volatile变量的值都是最新的。
当一个变量被 volatile
修饰时,任何线程对它的写操作都会立即刷新到主内存中,并且会强制让缓存了该变量的线程中的数据清空,必须从主内存重新读取最新数据。
主存可见性的原因:
上图为Java内存模型,由上图可知共享变量是保存在主内存中的,当一个线程需要操作共享变量时,需要从主内存拷贝一份共享变量的副本到本地内存(这个本地内存对其他线程是不可见的),此时如果线程修改了共享变量,则会把修改后的值写回到本地内存,但该变量由本地内存写回主内存的时间是不可控的,只要没有写回主内存后续线程就无法读取到该变量的最新值,这是其一。其二如果其他线程的本地内存中已经包含了该变量的副本,那么即使该线程把最新值写回到主内存,其他线程由于已经有副本了,所以重新去主内存读取该变量的时间也不可控。
另一个版本解释(在Java内存模型中,有main memory,每个线程也有自己的memory (例如寄存器)。为了性能,一个线程会在自己的memory中保持要访问的变量的副本。这样