jvm(7)happens-before 和 重排序

一.定义

happens-brfore是用来指定两个操作之间的执行顺序,用来保证可见性。

在java内存模型中,如果一个操作执行的结果要对另一个操作可见,那么这两个操作之间存在happens-before关系


二.happens-before规则

    1.程序顺序规则

        单线程中每个操作,总是前一个操作happens-before后一个操作

    2.监视器锁规则

        对一个锁的解锁,总是happens-before于对这个锁的加锁

    3.volatile变量规则

        对一个volatile修饰变量的写happens-before于 任意后续对这个变量的读

    4.传递性

        A happens-before B ,B happens-before C  ——> A happens-before C

    5.Start规则

        一个线程调用另一个线程,A线程中代码 happens-before B线程

    6.Join规则

        A线程jionB线程,B线程代码 happens-before A线程


三.重排序问题

   1. 编译器和处理器为了提高程序运行性能,代码之间单线程环境下不存在依赖性时可能会发生重排序

    2.数据依赖性:

        (1)没有依赖性

        (2)有依赖性  :写后读    读后写   写后写

    3.as-if-serial规则:不管指令怎么进行重排序,单线程下程序的执行结果都不会发生改变

    4.指令重排序的分类?

        (1)编译器重排序

        (2)处理器重排序(CPU 本地内存 主内存)

    5.指令重排序为什么能提高效率?

    因为可以在不改变语义的前提下,尽量减少寄存器的读取,存储次数

    (假设指令1 赋值给变量A并存放如寄存器, 指令2与A无关但要占用寄存器,第三条指令读取A,又要将A读取如寄存器,这时可以将2,3互换,这样可以使原来的指令3直接读取寄存器中的A)

猜你喜欢

转载自blog.csdn.net/qq_34645958/article/details/80875844