java指令重排和happens-before,内存屏障
从源代码到指令序列的重排序:
1) 编译器优化的重排序. 编译器在不改变单线程的语义情况下,重新安排语句的执行顺序.
2) 指令级的并行重排序. 现代处理器采用了指令级别的并行技术将多条指令重叠执行.
3) 内存系统的重排序.由于处理器使用缓存读/写缓冲区,使得加载和存储看上去可能是乱序执行.
对于编译器,JMM的编译器指令重排序规则会禁止特定的类型的编译器重排列,对于处理器的重排序,JMM的处理器重排序规则会要求插入特定类型的内存屏障,通过内存屏障指令来禁止特定类型的处理器重新排序.
------------------------------------------------------------------------------------
happens-before简介
在JMM中,如果一个操作的执行结果需要对另一个操作可见,两个操作之间必须存在happens-before关系.
1 程序顺序规则: 一个线程中的每个操作,happens-before于该线程中的任意后续操作
2 监视器锁规则: 对一个锁的解锁,happens-before于随后对这个锁的加锁
3 volatile变量规则: 对于一个volatile域的写,happens-before于任意后续对这个volatile域的读
两个操作具有happens-before关系,只需要前一个操作对后一个操作可见,且前一个操作按顺序排在第二个操作之前.
内存屏障:
确保指令重排序时不会将其后面的代码排到内存屏障之前
确保指令重排序时不会将其前面的代码排到内存屏障之后
确保在执行到内存屏障修饰的指令时前面的代码全都执行完成
强制将线程工作内存中的值修改到主内存中
如果是写操作,则会导致其他线程工作内存的缓存数据无效

浙公网安备 33010602011771号