- 什么是JMM?(java memory model)
JMM 即 Java 内存模型
多线程下 Java 代码的执行顺序,共享变量的读写
- 你写的代码,未必是实际运行的代码
代码的编写顺序,未必是实际执行顺序
- 多线程下,读写共享变量会有哪些问题?
可见性。有序性,原子性。
- 可见性的问原因:JIT编译器(会把一些热点代码及进行优化)所以造成可见性的问题。
- (工具)JavaP -c -v class路径 反编译(javaclass的字节码反编译成JVM的字节码指令)
- Jcstress压测工具
- 如果让一个线程总是占用 CPU 是不合理的,任务调度器会让线程分时使用 CPU
编译器以及硬件层面都会做层层优化,提升性能:
Compiler/JIT 优化
Processor(CPU)
流水线优化 Cache 优化
- 流水线的目的:流水线在 CPU 的一个时钟周期内会执行多个指令的不同部分。
- CPU的非流水线的操作
- CPU的流水线操作
- CPU的一个优化措施
在按序执行中,一旦遇到指令依赖的情况,流水线就会停滞
如果采用乱序执行,就可以跳到下一个非依赖指令并发布它。这样,执行单元就可以总是处于工作状态,把时间浪费减到最少。
例如: //3 会被重排到 //2 之前,以减少 //2 引起的流水线停滞。
X = 1 ;//1
Z = 3 ; //3
Y = X + 1;//2
- CPU缓存的简略版
- 缓存一致性协议:MESI协议
- JMM内存模型
多线程下,共享变量的读写顺序是头等大事,内存模型就是多线程下对共享变量的一组读写规则。
共享变量值是否在线程间同步
代码可能的执行顺序