Java Memory Model(Java 内存模型):
1 主要用来屏蔽各种硬件和操作系统的内存访问差异,以实现让java 程序 在各种平台下都能达到一致的内存访问。
2 JMM 规定了 所有变量都存储在主内存中,而针对于每一个线程还有自己的工作内存(Work Thread),线程的工作内存保存了该线程使用到的变量的主内存的副本拷贝。
3 线程对变量的操作都必须在工作内存中实现,而不能直接读写主内存的变量
4 不同的线程之间也无法也无法直接访问对方工作内存的变量。
5 线程之间变量的值得传递需要通过主内存来完成。
如何运行:
即一个变量如何从主内存拷贝到工作内存,如何从工作内存同步到主内存之内?
JMM定义了8种操作操作来完成。
lock:作用域主内存变量,他把一个变量标记为一条线程独占的状态
unlock:作用域主内存变量,他把一个处于锁定状态的变量释放出来,释放后的变量才可以被其他线程锁定。
read:作用域主内存变量,把一个变量值从主内存传输到线程的工作内存
load:作用于工作内存变量,他把read出来之后的变量的值放入到工作内存的变量副本中。
use:使用工作内存变量
assign:
store:作用与工作内存变量,把工作内存中一个变量的一个变量值传送到主内存
write:作用与主内存变量,他爸store操作得到值写入到主内存中。
volatile:它是对Java虚拟机提供的最轻量级的同步机制。他具备2中特性:
1 保证此变量对所有线程可见(一条线程修改了值,其他线程立即得知)普通线程是值得传递必须通过主内存来完成,线程A修改完值,然后然后向主内存进行回写,另外一条线程B在线程A写完之后再从主内存读取,新变量值才对B可见
2 禁止指令重排序优化:普通变量仅仅能够保证该方法执行过程所有依赖赋值的地方都讷讷个到正确的结果,但是不能保证该变量赋值的顺序与程序代码执行顺序一致。可以保证线程之间可见性和有序性。但是synchronized还可以保证原子性。