首先可以说一下为什么java虚拟机规范中要定义一种内存模型:
目的是为了屏蔽各种硬件和操作系统的内存访问差异,以实现让java程序在各种平台下都能达到一致的访问效果。
内存模型是如何做的呢?
首先java 内存模型规定了所有的的变量都存贮在主内存中。每条线程还有自己的工作内存,线程的工作内存中保存了被该线程使用到的变量的主内存副本拷贝,线程对变量的所有操作都必须在工作内存中进行,而不能直接读写主内存中的变量。不同的线程之间也无法直接访问对方的工作内存中的变量,线程间的变量值得传递均需要通过主内存来完成,线程,主内存,工作内存三者之间的交互关系。
主内存主要对应于java堆中的对象实例数据部分,而工作内存则对应于虚拟机栈中的部分区域。
当一个变量定义为volatile之后,他将具备两种特性,第一是保证此变量对所有线程的可见性,这里的可见性是指当一条线程修改了这个变量的值,新值对于其他的线程来说是可以立即知道的。而普通变量不能做到这一点,普通变量的值在线程间传递需要通过主内存来完成。
使用volatile变量的第二个语义是禁止指令重排序优化。
java内存模型是通过在变量修改后将新值同步回主内存,在变量读取前从主内存刷新变量值这种依赖主内存作为传递媒介的方式来实现可见性的,无论是普通变量还是volatile变量都是如此。