Java内存模型
Java内存模型(JMM):Java定义的一中抽象规范,用来屏蔽不同硬件和操作系统的内存访问差异,让Java程序在不同平台下都能达到一致的内存访问效果。
Java内存图示:
1、主内存:线程共享内存,线程读写访问较慢;
包括方法区和Java堆,对于一个共享变量(比如静态变量,堆内存中的实例),主内存存有其“本尊”。
2、工作内存:线程私有的内存,线程访问较快。
对于主内存中的某个变量,使用它的线程的内存空间保存了它的一个”副本”。
线程对共享变量的所有操作都必须在其工作内存中进行,不能直接读写主内存中的变量。
不同线程之间也无法访问彼此的工作内存,变量值在线程之间的传递只能通过主内存来传递。
举个例子:
对于一个静态变量 static int s = 0;
线程A执行代码 s = 3;
那么,JMM的工作流程如下图所示:
在上面过程中,线程A把静态变量s=0从主内存中读取到工作内存,再把s=3的更新值写入主内存。
这从单线程的角度来看,完全没有任何问题。
但是如果在程序中引入线程B,线程B执行如下代码:
System.out.println("s="+s);
则会出现2种结果,分别为s=0或者s=3。
出现s=0结果原因:线程A在工作内存中更新的s变量后,不会立即同步到主内存,所以虽然线