在上文中说了,在并发编程中可能出现原子性、可见性和有序性的问题。JDK提供了volatile关键字解决这些问题。
首先,先谈一下java语言里面的原子性,像int i =0 ;flag = true; 引用a = 引用b,这些变量的简单赋值操作都是原子的。
但是很多复杂的一些操作,i++,先读取i的值,再更新i的值,这种操作不是简单赋值写,它是有计算的过程在里面的,此时java语言默认规范不保证原子性的。
but,为什么这里谈到volatile解决原子性那?其实volatile对原子性保障的语义,在java里很有限的,几乎可以忽略不计。32位的java虚拟机里面,对long/double变量的赋值写不是原子的,但是加上了volatile,就可以保证在32位虚拟机里面,对long/double变量的赋值是原子性的。
volatile解决可见性和有序性问题都是通过内存屏障实现的。
再有人问你volatile是什么,把这篇文章也发给他
内存模型是怎么解决缓存一致性问题的?
缓存一致性协议-MESI协议
从硬件缓存模型到Java内存模型原理浅析