JVM-7-线程内存模型
2019-09-30 本文已影响0人
宠辱不惊的咸鱼
计算机缓存模型

java缓存模型
-
主内存主要对应堆
-
工作内存属于线程私有,可能是cpu寄存器或者高速缓存
jvm-003.jpg
-
原子操作
-
lock(锁定):作用于主内存变量,把一个变量标志为一个线程独占状态
-
unlock(解锁):作用于主内存变量,把一个处于锁定状态的变量释放出来,释放后的变量才可以被其他线程锁定
-
read(读取):作用于主内存变量,把一个变量的值从主内存传输到线程工作内存中,供随后的load动作使用
-
load(载入):作用于工作内存变量,把read操作的结果放入工作内存的变量副本中
-
use(使用):作用于工作内存变量,把工作内存中一个变量的值传递给执行引擎
-
assign(赋值):作用于工作内存变量,把一个从执行引擎接受到的值赋给工作内存的变量
-
store(存储):作用于工作内存变量,把工作内存中一个变量的值传送到主内存中,供随后的write操作使用
-
write(写入):作用于主内存变量,把store操作的结果放入主内存的变量中
jvm-004.jpg
-
此处的lock和unlock属于底层操作,未开放
-
开放的是字节码monitorenter和monitorexit,即synchronized
-
-
可见性
- volatile强制变量被线程访问时,从主内存重读;修改时,写回主内存
-
有序性
- 本线程内观察,均有序
- 本线程观察别的线程,均无序
//线程1:
context = loadContext(); //语句1
inited = true; //语句2
//线程2:
while(!inited ){
sleep()
}
doSomethingwithconfig(context);
操作系统线程实现
- native:往往意味着未使用或无法使用平台无关的方式实现
- 实现方式
-
使用内核线程实现
- 以内核线程实现轻量级进程,供应用程序调用
-
弊端:涉及系统调用,消耗内核资源
jvm-005.jpg
-
使用用户线程实现
- 应用进程使用多个用户线程
-
弊端:缺少内核支持,阻塞处理和多处理器映射等困难
jvm-006.jpg
-
使用用户线程加轻量级进程混合实现
jvm-007.jpg
-
java线程实现
- JDK 1.2之前基于用户线程实现
- JDK 1.2开始基于操作系统原生线程实现,意味着平台相关
- 目前Windows和Linux都是基于轻量级进程实现,即1:1模型
线程调度
- 抢占式调度,系统自动完成
- 优先级,给系统一些“建议”
- 由于java线程是操作系统原生线程,实际调度取决于操作系统
-
Windows提供了7个级别,而java是10个
jvm-008.jpg
线程状态转化
