JAVA内存模型与线程
2021-06-07 10:02:45 15 举报
AI智能生成
深入理解JVM虚拟机-内部知识分享
作者其他创作
大纲/内容
java与协程
内核线程的局限
协程的复苏
java的解决方案
JAVA线程
线程的实现
使用内核线程实现(1:1)
分支主题
使用用户线程实现(1:N)
分支主题
使用用户线程+轻量级进程混合实现(N:M)
分支主题
分支主题
java线程的调度
协同式线程低调度
抢占式线程调度
状态转换
概述
摩尔定律
硬件的效率与一致性
让计算机更快
并发处理
矛盾:存储设备与处理器速度有几个数量级的差异
高速缓存
问题:缓存一致性
操作系统内存模型
处理器优化:乱序执行
分支主题
MESI协议
修改(M),私有修改过
独家(E),私有未修改过
共享(S),共享未修改过
无效(I),无效
MESI协议升级
存储缓存(Store Bufferes)
失效队列(Invalid Queue)
内存屏障
写屏障
读屏障
JAVA内存模型
主内存与工作内存
主内存
所有的变量都在主内存中
工作内存
每条线程有自己的工作线程
对变量的所有操作都在工作内存中
无法访问其他线程工作内存中的变量
分支主题
内存间交互操作
8个操作
Lock锁定 作用于主内存变量,将变量标志为一条线程所独占
Unlock解锁 作用于主内存变量,将处于锁定的变量释放出来
Read读取 作用于主内存变量,它将一个变量的值从主内存传输到线程的工作内存中
Load载入 作用于工作内存变量,它把从主内存读取的变量值放入工作内存的副本中
Use使用 作用于工作内存变量,将工作内存变量值传递给执行引擎
Assgin赋值 作用于工作内存变量,将执行引擎的值传递给工作内存的变量
Store存储 作用于工作内存变量,它把工作内存变量传递到主内存中
Write写入 作用于主内存变量,把Store操作从工作内存得到的变量值放入主内存变量中
8个规则
8个操作的规则定义
volatile的特殊规则
保证变量对所有线程的可见性
工作线程每次使用的时候都要先刷新
指令重排序
JVM内存屏障
LoadLoad
Load1; LoadLoad; Load2,在Load2及后续读取操作要读取的数据被访问前,保证Load1要读取的数据被读取完毕
LoadStore
Load1; LoadStore; Store2,在Store2及后续写入操作被刷出前,保证Load1要读取的数据被读取完毕。
StoreLoad
Store1; StoreLoad; Load2,在Load2及后续所有读取操作执行前,保证Store1的写入对所有处理器可见。它的开销是四种屏障中最大的。
在大多数处理器的实现中,这个屏障是个万能屏障,兼具其它三种内存屏障的功能。
StoreStore
Store1; StoreStore; Store2,在Store2及后续写入操作执行前,保证Store1的写入操作对其它处理器可见。
long、double的特殊规则
64位机器不会有该情况
原子性
内存模型:lock、unlock
字节码指令:minitorenter、monitorexit(对应的是 synchronized)
可见性
volatile、synchronzined、final(构造器初始化完成既可见)
有序性
线程内串行
volatile、synchronzined
先行发生原则
(时间先后顺序与先行发生原则没有因果关系)
程序次序规则:在一个线程内一段代码的执行结果是有序的。就是还会指令重排,但是随便它怎么排,结果是按照我们代码的顺序生成的不会变。
管程锁定规则:就是无论是在单线程环境还是多线程环境,对于同一个锁来说,一个线程对这个锁解锁之后,另一个线程获取了这个锁都能看到前一个线程的操作结果!(管程是一种通用的同步原语,synchronized就是管程的实现)
volatile变量规则:就是如果一个线程先去写一个volatile变量,然后一个线程去读这个变量,那么这个写操作的结果一定对读的这个线程可见。
线程启动规则:在主线程A执行过程中,启动子线程B,那么线程A在启动子线程B之前对共享变量的修改结果对线程B可见。
线程终止规则:在主线程A执行过程中,子线程B终止,那么线程B在终止之前对共享变量的修改结果在线程A中可见。也称线程join()规则。
线程中断规则:对线程interrupt()方法的调用先行发生于被中断线程代码检测到中断事件的发生,可以通过Thread.interrupted()检测到是否发生中断。
对象终结规则:这个也简单的,就是一个对象的初始化的完成,也就是构造函数执行的结束一定 happens-before它的finalize()方法。
传递性规则:这个简单的,就是happens-before原则具有传递性,即hb(A, B) , hb(B, C),那么hb(A, C)。
收藏
0 条评论
下一页