深入理解JVM:Java内存模型与线程
概述
衡量一个服务性能的高低好坏,每秒事务处理数(Transactions Per Second,TPS)是重要的指标之一,它代表着一秒内服务端平均能响应的请求总数,而TPS值与程序的并发能力又有非常密切的关系。
硬件的效率与一致性
- 硬件的效率问题:
- 处理器至少要与内存交互,如读取运算数据、存储运算结果等,这个I/O操作就是很难消除的(无法仅靠寄存器来完成所有运算任务)。
- 解决:
- 高速缓存(Cache),用来作为内存与处理器之间的缓冲;
- 导致新的问题:
- 缓存一致性(Cache Coherence):每个处理器都有自己的高速缓存,而它们又共享同一主内存(Main Memory),多个处理器任务涉及同一主内存区域时,可能导致各自的缓存数据不一致。
- 解决:
- 各个处理器访问缓存时都遵循一些协议:MSI、MESI(Illinois Protocol)、MOSI、Synapse、Firefly 及 Dragon Protocol等。
- “内存模型”:可以理解为在特定的操作协议下,对特定的内存或高速缓存进行读写访问的过程抽象。
- 不同架构的物理机器可以拥有不一样的内存模型,而Java虚拟机也有自己的内存模型;
硬件的内存模型:
除了增加高速缓存之外,为了使处理器内部的运算单元能尽量被充分利用,处理器可能会对输入代码进行乱序执行(Out-Of-Order Execution)优化,处理器会在计算之后将乱序执行的结果重组,保证该结果与顺序执行的结果是一致的,但并不保证程序中各个语句计算的先后顺序与输入代码中的顺序一致,因此如果存在一个计算任务依赖另外一个计算任务的中间结果,那么其顺序性并不能靠代码的先后顺序来保证。
与处理器的乱序执行优化类似,Java虚拟机的即时编译器中也有指令重排序(Instruction Reorder)优化。
Java内存模型
主内存与工作内存
内存间交互操作
对于volatile型变量的特殊规则
针对long和double型变量的特殊规则
原子性、可见性与有序性
先行发生原则
Java与线程
线程的实现
Java线程调度
状态转换
Java与协程
12.5.1 内核线程的局限 12.5.2 协程的复苏 12.5.3 Java的解决方案