深入理解Java内存模型


评星:(共0人评价)
作者:程晓明
ISBN:
出版年份:
页数:76
语言:
文件大小:0
文件格式:
标签: Java JVM
书籍简介

Java内存模型介绍 

内存模型的作用范围:

在Java中,所有实例域、静态域和数组元素存放在堆内存中,线程之间共享,下文称之为“共享变量”。局部变量、方法参数、异常处理器等不会在线程之间共享,不存在内存可见性问题,也不受内存模型的影响。

重排序与可见性:

现代编译器在编译源码时会做一些优化处理,对代码指令进行重排序;现代流水线结构的处理器为了提高并行度,在执行时也可能对指令做一些顺序上的调整。重排序包括编译器重排序、指令级并行重排序和内存系统重排序等。一般来说,编译器和处理器在做重排序的时候都会做一些保证,保证程序的执行结果与重排序之前指令的执行结果相同。即as-if-serial,不管怎样重排序,都不能改变程序的执行结果。

CPU在执行指令时一般都会使用缓存技术来提高效率,如果不同线程使用不同的缓存空间则会造成一个线程对一个共享变量的更新不能及时反映给其他线程,也就是多线程对共享变量更新的可见性问题,这个问题是非常复杂的。

Java内存模型的抽象:

对于上述问题,Java内存模型(JMM)为程序员提供了一个抽象层面的描述,我们不用去关心编译器、处理器对指令做了怎样的重排序,也不用关心复杂的系统缓存机制,只要遵循JMM的规则,JMM就能为我们提供代码顺序性、共享变量可见性的保证,从而得到预期的执行结果。

JMM决定了一个线程对共享变量的写入何时对另一个线程可见。从抽象来讲,线程共享变量存放在主内存(main memory),每个线程持有一个本地内存(local memory),本地内存中存储了该线程读写共享变量的副本(本地内存是JMM的一个抽象概念,并不是真实存在的)。


猜你喜欢