Java的内存模型设置的想法是为了达到屏蔽各种硬件和操作系统访问内存的差异,以达到在各个平台统一的,一致的访问内存效果。因为之前的C/C++,直接使用物理硬件和操作系统内存的模型,这样的话,有可能这个程序在不同的硬件和平台就不能正常运行了。
1.1 工作内存和主内存
变量:实例字段,静态字段,构成数组对象的元素。不包括局部变量和方法参数。
实例字段是在类级别声明的变量。
java内存模型规定了,所有的变量都存储在主内存中(Main Memory)。
每条线程都有自己的工作内存(Working Memory)。
该线程的工作内存保存了被该线程使用到的变量的主内存副本拷贝。这种拷贝只会把使用到的拷贝,不会将整个对象拷贝。
主内存,工作内存,线程的三者关系。
1.2 内存间交互操作
从主内存拷贝到工作内存,在从工作内存同步回主内存,需要执行8中操作,这8步操作都是原子的,不可再分的。
1:lock(锁定):作用于主内存的变量,它把一个变量标识为一条线程独占的状态。
2:unlock(解锁) :作用于主内存的变量,它把一个处于锁定状态的变量释放出来,释放后的变量才可以被其他线程锁定。
3:read(读取):作用于主内存的变量,把一个主内存的变量值传输到线程的工作内存中,以便于随后的load使用。
4 :load(载入):作用于工作内存的变量,把从主内存read的变量,放入到线程的工作内存的变量副本里。
5:use(使用):作用于工作内存的变量,将工作内存的一个变量值递给执行引擎。这要虚拟机遇到执行这个变量值的字节码指令,才会执行的。
6:assign(赋值):作用于工作内存的变量,它把执行引擎接收到的值赋给工作内存的变量。也是要有赋值的字节码指令才会执行的
7:store (存储):作用于工作内存中,他把工作内存的变量,传送到主内存中,以便于下面的write操作。
8:write (写入) :作用于主内存的变量,它把store操作,从工作内存得到的变量值,写入到主内存的变量中。