前言:Java内存模型简称JMM(Java Memory Model)
由来
JMM的设计主要是为了屏蔽各种硬件和操作系统的内存访问差异,以实现让Java程序在各种平台下都能达到一直的内存访问效果。它主要的目标就是定义程序中各个变量的访问规则。
分类
JMM主要分为主内存(Main Memory) 和工作内存(Working Memory)
1.所有的变量的都存储在主内存;
2.每条线程都有自己的工作线程,工作线程保存了被该线程使用到的变量的主内存的副本拷贝;
3.线程对变量的所有操作(读取/赋值)等操作都是在工作线程中完成的,而不能直接读取主内存中的数据。
4.不同线程之间也无法访问访问对方的工作线程中的变量,线程之间的数据的传递都是通过主内存完成的。
5.他们的关系图如下所示:
注:这里所说的内存划分和Java内存区域中的堆/栈/方法去等并不是统一层次的划分,两者基本上没有关系的。
内存间的交互
我们上面也说了,线程之间是没办法访问,所以我们主要的交互就是:
1.怎么将工作内存的数据同步到主内存中?
2.怎么将主内存的数据拷贝到工作线程中?
以下是Java内存中定义的8种操作(在最新的文档中已弃用,所以这里只是稍微提一下):
1.lock(锁定):作用于主内存变量,他把一个变量标记为一个线程独占的状态;
2.unlock(解锁):作用于主内存变量,他将一个锁定的变量释放出来;
3.read(读取):作用于主内存变量,他将一个变量从主内存中传输到工作内存中;
4.load(载入):作用于工作内存变量,他将从主内存得到的变量放入到工作内存的变量副本中
5.use(使用):作用于工作变量,他将变量交给执行引擎;
6.assign(赋值):作用于工作内存变量,他将执行引擎返回的数据赋值给工作内存中的变量;
7.store(存储):作用于工作内存变量,他将工作内存的变量传给主内存;
8.write(写入):作用于主内存变量,他将从工作内存中获取的变量回写到主内存中;
待续
还没总结完,会继续更新... (因为自己对这块了解的比较少,也是边学习边更新)