《深入理解java虚拟机》-第五部分 高效并发
1、java内存模型
模型图:
主内存与工作内存交互协议:
操作符 | 操作名称 | 作用域 | 作用 |
---|---|---|---|
lock | 锁定 | 主内存 | 把一个变量标识为一条线程独占状态 |
unlock | 解锁 | 主内存 | 把一个处于锁定状态的变量释放出来,之后变量才可其他线程锁定 |
read | 读取 | 主内存 | 把一个变量的值从主内存传输到工作内存 |
load | 载入 | 工作内存 | 把从主内存read的变量值放入工作内存的变量副本中 |
use | 使用 | 工作内存 | 把工作内存中一个变量值传递给工作引擎 |
assign | 赋值 | 工作内存 | 把从执行引擎接收的变量值赋给工作内存变量 |
store | 存储 | 工作内存 | 把工作内存一个变量值传递到主内存中 |
write | 写入 | 主内存 | 把工作内存store过来的值放入主内存变量 |
2、几个小知识点
原子性:基本数据类型的读写都具备原子性
可见性:当一个线程修改了共享变量值时,其他现场能够立刻得知(volatile、synchronized、final)
有序性:如果在本线程内观察,所有操作都是有序的;如果在一个线程中观察另一个线程,所有操作都是无序的
volatile特性:可见性、禁止指令重排;
synchronized:一个变量在同一时刻只允许一条线程对其进行lock操作
final:被final修饰的字段在构造器中一旦被初始化完成,并且构造器没有把“this”的引用传递出去,那么在其他线程中就能看见final字段的值。
3、java线程、协程和纤程
模型:1:1的线程模型(即基于操作系统原生线程模型实现)
调度:抢占式调度
状态:
状态 | 状态名 | 释义 |
---|---|---|
New | 新建 | 创建后尚未启动的线程 |
Runable | 运行 | 包括操作系统线程状态中的Running和Ready。线程有可能正在执行,有可能正在等待操作系统为它分配执行时间 |
Waiting | 无限期等待 | 等待被其他线程显示唤醒 |
Timed Waiting | 限期等待 | 限期结束后由操作系统唤醒 |
Blocked | 阻塞 | 阻塞是在等着获取排它锁,等待是在等待一段时间 |
Terminated | 结束 | 线程结束执行后的已终止态 |
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。