Java内存模型(JMM,并非JVM内存模型)是一个抽象的规范,保证Java程序在各种平台下对内存的访问都能得到一致的效果。
线程之间的通信通常有两种方式:共享内存和消息传递。Java的并发采用共享内存的方式
共享内存和消息传递
JMM规定了内存主要划分为主内存和工作内存两种。
规定所有的变量都存储在主内存中,每条线程还有自己的工作内存。
线程的工作内存中保存了该线程中用到的变量的主内存的副本拷贝,线程对变量的所有操作都必须在工作内存中进行,而不能直接读写主内存。
不同的线程之间也无法直接访问对方工作内存中的变量,线程间变量的传递均需要自己的工作内存和主存之间进行数据同步进行。
本地内存对速度要求更高,大部分使用寄存器和CPU缓存实现。
而heap中需要存储大量的对象,需要更大的容量,它大部分使用主存来实现。
JMM定义了8个操作来完成主内存和工作内存的交互操作
| 指令 | 用途 | 作用于 |
|---|---|---|
| lock加锁 | 把主内存中的变量标志为一条线程独占的状态 | 主内存 |
| read读取 | 将一个变量的值从主内存传输到工作内存中 | 主内存 |
| load加载 | 把read得到的值加载到工作内存的变量副本中 | 工作内存 |
| use使用 | 把工作内存中变量的值传递给执行引擎 | 工作内存 |
| assign赋值 | 把从执行引擎接收到的值赋值给工作内存的变量 | 工作内存 |
| store存储 | 把工作内存中变量的值传送回主内存中 | 工作内存 |
| write写入 | 把store得到的值放入主内存的变量中 | 主内存 |
| unlock解锁 | 把主内存中处于锁定状态的变量释放出来 | 主内存 |
原子性:
一个操作中CPU 不可以在中途暂停然后再调度,要么不执行,要么就执行完成。
可见性:
多个线程访问同一个变量时,一个线程修改了这个变量的值,其他线程能够立即看得到修改后的值。
有序性:
程序执行的顺序按照代码的先后顺序执行,不能重排,导致程序出现不一致的结果。
Java提供了一些关键字:Java同步关键字和类
参考资料JMM



