这篇文章是我之前看书时做的笔记,内容都是基于【深入理解 JVM 虚拟机】(周志明)这本书中介绍的东西,觉得有一定的价值所以拿出来分享。并且个人时间总是有限的,无法保证大量的产出,因此拿点之前的东西来充个数。
硬件的效率与一致性
由于计算的存储设备与处理器的运算速度有几个数量级的差距,所以现代计算机系统都不得不加入一层读写速度尽可能接近处理器运算速度的高速缓存(Cache)来作为内存与处理器之间的缓冲。
但是它引入了一个新的问题:缓存一致性(Cache Coherence)。在多处理器系统中,每个处理器都有自己的高速缓存,而他们又共享同一主内存(Main Memory),当多个处理器的运算任务都涉及同一块主内存区域时,将可能导致各自的缓存数据不一致。
Java 内存模型
主内存与工作内存
Java 内存模型主要目标是定义程序中各个变量的访问规则,即在虚拟机中将变量存储到内存和从内存中取出变量这样的底层细节。此处的变量(Variables)与 Java 编程中所说的变量有所区别,它包括了实例字段、静态字段和构成数组对象的元素,但不包括局部变量与方法参数,因为后者是线程私有的,不会被共享,自然就不会存在竞争问题。
Java 内存模型规定了所有的变量都存储在主内存(Main Memory)中,每条线程还有自己的工作内存(Working Memory),线程的工作内存中保存了被该线程使用到的变量的主内存拷贝,线程对变量的所有操作(读取、赋值)都必须在工作内存中进行,线程间传递变量需要通过主内存来完成。
内存间交互操作
Java 内存模型中定义了以下 8 种操作来完成,虚拟机实现必须保证下面提到的每一种操作都是原子的、不可再分的。
- lock(锁定):作用于主内存的变量,它把每一个变量标识为一条线程独占的状态。
- unlock(解锁):作用于主内存的变量,他把一个处于锁定状态的变量释放出来,释放后的变量才可以被其他线程锁定。
- read(读取):作用于主内存的变量,他把一个变量的值从主内存传输到线程工作的内存中,以便随后的 load 动作使用。
- load(载入):作用于工作内存的变量,它把 r