Java并发编程之什么是指令重排序?
- 1.1 指令重排序的原因
- 1.2 指令重排序的示例
- 1.3 指令重排序的影响
- 1.4 如何避免指令重排序带来的问题?
- 1.5 使用原子类
- 1.6 使用 final 关键字
- 1.7 内存屏障(Memory Barrier)
- 1.8 总结
在Java中,指令重排序是指编译器和处理器为了提高程序执行效率,可能会对指令的执行顺序进行重新排列。这种重排序不会改变单线程程序的执行结果(即遵循as-if-serial语义),但在多线程环境下,可能会导致不可预期的行为。
1.1 指令重排序的原因
- 编译器优化:编译器在生成字节码时,可能会重新排列指令的顺序以优化性能。
- 处理器优化:现代处理器可能会对指令进行乱序执行(Out-of-Order Execution),以充分利用CPU资源。
- 内存系统优化:为了提高内存访问效率,处理器可能会对内存操作进行重排序。
1.2 指令重排序的示例
int a = 0;
boolean flag = false;// 线程1
void w