java技术

大家好!今天我们来探讨一下Java的内存模型。Java内存模型(Java Memory Model,JMM)设计的目标是定义程序中的各种共享内存顺序,定义了线程之间通过内存进行交互的规则。

首先,我们得了解Java内存模型是在哪个层次上工作的。在这里,Java内存模型直接处理RAM(或者说是一级缓存、寄存器等)。这个模型是被用来完成实例字段、静态字段和构成数组对象的元素的读和写操作。Java内存模型屏蔽了各种硬件和操作系统的内存访问差异,以实现让Java程序在各种平台下都能达到一致的内存访问效果。

Java内存模型的主要目标是以定义程序中各个变量(实例字段、静态字段和构成数组对象的元素)的访问规则,在JVM中,规则固定了一个线程对共享变量写入的值对于另一个线程是可见的,而且在何种条件下,读操作可以看到写操作的结果。

### Java内存结构

Java内存主要分为堆(Heap)和栈(Stack)部分。

– 堆:存放所有定义为new的对象。每当创建一个新对象时,JVM会在堆中为它分配内存。
– 栈:每一个线程都有一个私有的Java栈。一个Java栈是由一个个的栈帧组成,每当调用一个方法时,就会创建一个新的栈帧。

### JMM与线程通信

Java内存模型主要解决的就是线程间的通信和同步问题。线程间的共享变量存储在主内存(Main Memory)中,每个线程都有一个私有的本地内存(Local Memory),本地内存中存储了被该线程使用到的主内存的共享变量的副本拷贝。

线程对共享变量的所有操作都必须在自己的本地内存中进行,而不能直接读写主内存中的数据。然后,线程间的通信(例如 t1 线程写入了变量 v’s 的值,然后 t2 纔线程读取变量 v 的值)必须通过主内存来完成。

### Java内存模型的规定

在JMM中,从主内存跟新数据到各个线程的工作内存,再返回主内存的过程中,Java语言规定了8种操作完成,包括:lock、unlock、read、load、use、assign、store、write。

这8种操作分别包含了:

1. 对一个变量实施lock操作,会清空工作内存中此变量的值,在执行引擎使用这个变量前需要重新load或assign的初始化值。
2. 对一个变量unlock前,需要将变量同步回主内存。

总结,理解Java内存模型对于我们写出更有效且没那么多debug的代码是很重要的。JMM其实是围绕着’原子性’、’有序性’和’可见性’三个特性展开的,它们是现代多线程程序中的三大问题。理解了JMM,我们就能更好地理解并发程序的运行原理,从而写出更高效、更安全的并发代码。


已发布

分类

来自

标签:

评论

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注