有序性(gold_axe)

2020-02-05  本文已影响0人  胖达_4b7e

重排序概念

是一种优化
不影响单线程程序正确性的情况下,提升性能
为了性能, 物理上不能被禁止, 只能被逻辑上部分禁止,
Java是通过内存屏障实现逻辑上部分禁止的

术语

指令重排序

源码和程序不一致或者 程序和执行 顺序不一致

JIT编译造成

比如new出来的对象还么有初始化完成就被使用了,
这是因为
1.分配实例所需空间, 获得一个指向该空间的引用objRef
2.初始化实例
3.把objRef复制给变量,继续
这3个顺序不一定, 可能先3再2

2种Java编译器
静态的javac: 不会重排
动态的JIT: 字节码->本地代码(机器码),在程序运行过程中介入,会重排

处理器造成(又叫乱序执行)

- 1.顺序读取

  指令 按 程序顺序 被处理器读取

- 2,乱序执行

  那条就绪 就会先被执行

- 3.执行结果 先存入 重排序缓冲器 ROB

- 4.顺序提交

  ROB中的结果按程序顺序提交到寄存器 或者 内存

存储子系统重排序

是指感知顺序(某一处理器观察到的) 和其他顺序不一样
不是有什么被重排了, 而是一种现象

貌似串行语义

就是虽然重排了, 看起来和单线程下顺序的一样
这是重排必须达到的结果.
重排序必须遵守一些规则, 这些规则保证了这个结果.

但是只能保证单线程是这样.

存在数据依赖关系的语句不重排, 就能保证这个语义了

数据依赖关系:

存在依赖关系 就是2者的先后不允许被重排的,

控制依赖 不属于 数据依赖关系, 不然就不会有猜测执行了

保证内存访问的顺序性

只能逻辑上部分禁止重排序, 物理上禁止性能太低了
,Java是跨平台的语义, 禁止重排序是通过调用相应的指令
就是 内存屏障

我只要使用volatile synchronized就行了

上一篇 下一篇

猜你喜欢

热点阅读