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关系,只需要前一个操作对后一个操作可见,且前一个操作按顺序排在第二个操作之前.

 

 

内存屏障:

确保指令重排序时不会将其后面的代码排到内存屏障之前

确保指令重排序时不会将其前面的代码排到内存屏障之后

确保在执行到内存屏障修饰的指令时前面的代码全都执行完成

强制将线程工作内存中的值修改到主内存中

如果是写操作,则会导致其他线程工作内存的缓存数据无效

 

posted @ 2018-09-04 16:30  寅辰  阅读(619)  评论(0)    收藏  举报