1、保证变量的可⻅性
当一个变量被volatile修饰后,可以保证此变量对所有线程的“可见性”。
这里的“可见性”是指当一条线程修改了这个变量的值,新值对于其他线程来说是可以立即得知的。但是不能因此得出“基于volatile变量的运算在并发下是安全的”这个结论。因为在Java里面的运算并非原子操作,导致volatile变量的运算在并发下一样是不安全的。
例如:用volatile修饰变量race,启动20个线程,每个线程对race变量进行10000次的自增操作,理想情况的输出结果是200000,但是每次执行代码得到的实际结果都是小于200000的数字。
这是因为自增运算大概分三步:读 --> 自增 --> 写,在并发条件下,读到的有可能是过期数据!
2、防止指令重排序
重排序是指JVM的即时编译器和处理器为了优化程序性能而对指令序列进行重新排序的一种手段。