Java内存模型与线程

线程与内存

CPU内存模型:
Java内存模型与线程

JVM内存模型:
Java内存模型与线程

Java中线程只能对工作内存进行操作,保证线程中使用到的变量都在工作内存中存在一份拷贝。

Java中的主内存主要对应于Java堆中的对象实例部分,而工作内存则对应于虚拟机栈中的部分区域。

虚拟机可能会让工作内存优先存储与寄存器和高速缓存中,以获得更高的运行速度。

内存交互

lock指令,将主内存的变量标志为线程独占的状态。

将一个变量从主内存复制到工作内存,需要顺序地执行read和load操作,但这两个操作不保证顺序执行。

volatile

保证可见性和有序性。

原理:被volatile修饰的变量在赋值之后多了一个lock操作,相当于一个内存屏障(Memory Barrier),指重排序时不能把后面的指令重排到内存屏障之前的位置。lock前缀的作用是使得本cpu的cache写入内存,该写入动作也会引起其他cpu的cache无效化。

指令重排是指CPU允许将多条指令不按程序规定的顺序分开发送给各相应电路单元来处理。在单线程情况下,被重排的指令在外部看起来仍然是有序的。

因为lock指令代表了在lock之前的操作都已经完成,因此lock就相当于一个内存屏障,防止了指令重排。