一、JAVA内存模型与线程
1 CPU工作效率比IO工作效率大
1.1 为什么
计算机的存储设备与处理器的运算速度有几个数量级的差距
1.2 怎么处理CPU与IO之间效率的差距
加入一层读写速度尽可能接近处理器运算速度的高速缓存(Cache)作为内存与处理器之间的缓冲
内存->缓存(计算)->内存
1.3 引发什么问题?
缓存一致性,也是因为这一点,所以有了线程安全问题
1.4 操作系统是如何解决缓存一致性的问题的?
通过协议进行处理
1.5 什么是指令重排序?
处理器可能会对输入代码进行乱序执行(Out-of-Order Execution)优化,以让处理器内部的运算单元能尽量被充分利用
2 JAVA内存模型
2.1 为什么需要使用JAVA自定义的内存模型
屏蔽各种硬件和操作系统内存访问差异
2.2 JAVA工作的主内存与工作内存是什么?
主内存
所有变量都存储在主内存
对应堆中的对象实例数据部分
直接对应于物理硬件的内存
工作内存
线程私有的内存区域,存储主内存中变量的副本
对变量的操作都是在工作内存中,不能对主内存进行操作
不同线程不能相互访问工作内存
对应虚拟机栈中的部分区域
对应物理硬件的寄存器和高速缓存
3 内存间交互操作指令
lock(锁定)
作用于主内存的变量,把一个变量标志为一条线程独占的状态
unlock(解锁)
作用于内存的变量,把一个处于锁定状态的变量释放出来
read(读取)
把变量的值从主内存传输到线程的工作内存
load(载入)
把read操作从主内存中得到的变量值放入工作内存的变量副本中
use(使用)
把工作内存中一个变量的值传递给执行引擎
assign(赋值)
从执行引擎接受到的值赋给工作内存的变量
store(存储)
把工作内存中的一个变量的值传送到主内存中
write(写入)
把store操作从工作内存中