java多线程---内存屏障

    我们的线程,获得和释放锁,分别执行了两个操作:刷新处理器缓存和冲刷处理器缓存。对于同一个锁所保护的共享数据而言,前一个动作保证了该锁的当前持有线程能够读取到最新数据,后一个动作保证了该锁的当前持有线程能够让更新对后面的线程可见。这两个动作是如何实现的呢?就是今天引入的主题:内存保障

    jvm底层借助内存屏障来实现上述两个动作,内存屏障是对一类针对内存读,写操作指令的跨处理器架构的比较底层的抽象。它是被插入到两个指令之间使用的,

    作用:禁止编译器,处理器重排序从而保障有序性。

 

一,重排序

    

重排序方式:1.编译器优化重排序,cpu只读一次x和y的值,不需要反复读取寄存器来交替x和y的值。

                     2.处理器重排序(指令级并行):将多条指令重叠执行,处理器可改变对应机器指令的执行顺序

                    3.内存系统的重排序:使用缓存进行读/写,使得加载和存储操作有可能乱序。

数据依赖性:两个操作访问同一个变量,且有一个为写操作,则两个操作就存在数据依赖性。

例如:写后读:a=1;b=a; 写后写:a=1;a=2; 读后写:a=b;b=1;

    如果对这三种情况进行重排序,则会改变结果,编译器和处理器不会处理存在有依赖的执行顺序。但是这个只是针对单处理器or单线程的。对于多线程的通信是未知的!

as-if-serial:不管怎么排序,单线程程序的执行结果不能改变。编译器,runtime和处理器都必须遵守这个原则。

 

二,内存屏障

    jmm的“处理器重排序规则”会要求java编译器在生成指令序列时,插入特定类型的内存屏障。通过内存屏障来禁止特定类型的 【处理器重排序】

    为了处理cpu修改数据(发生在缓冲区),而读取数据发生在内存中,两者数据不一致问题。

说明:jmm的本地内存是抽象的,其实是不存在的,真是的是本地内存覆盖了:缓存,写缓冲区,寄存器以及其他的硬件和编译器优化。

    线程把读和写操作进行分离了,读是从主内存中,而写是修改写缓冲区,然后把缓冲区的数据更新到主内存中。

(这里就出现了问题,我写了,还没有更新到内存中,另外一个人就读取了,这就是修改的不可见性,也就是脏读;同时独写分离了,那么他们的处理指令也分离了,开始重新排序了,这也会出现问题。)

 

    解决方法:1.写内存屏障:处理器将存储缓存值 写回 主存(阻塞方式)

                     2.读内存屏障:处理器,处理失效队列(阻塞方式)

有各种屏障类型,每个类型保证数据的顺序不同,比如在读取前完成某些操作,在写入前完成某些操作,

 

volatile 读前插入读屏障,写后加写屏障,避免cpu重排导致的问题,实现多线程之间的可见性。

对于处理器来说,内存屏障会导致cpu缓存的刷新,刷新时,会遵循缓存一致性协议。

lock:解锁时,jvm会强制刷新cpu缓存,导致当前线程更改,对其他线程可见。

volatile:标记volatile的字段,在写操作时,会强制刷新cpu缓存,标记volatile的字段,每次读取都是直接读内存。

final:即时编译器在final写操作后,会插入内存屏障,来禁止重排序,保证可见性

 

三,happens-before 原则

1.单线程h-b原则:在同一个线程中,书写在前面的操作happens-before后面的操作

2.锁的h-b原则:同一个锁的unlock操作h-b此锁的lock操作

3.volatile的h-b原则:对一个volatile变量的写操作h-b 对此变量的任意操作

4.h-b传递性原则:如果a操作h-b b操作,b操作 h-b c操作,那么a操作 h-b  c操作。

5.线程启动的h-b原则:对同一个线程的start方法 h-b 此线程的其他方法。

6.线程中断的h-b原则:对线程interrupt方法的调用 h-b 被中断线程的检测到中断发送的信号

7.线程终结的h-b原则:线程中的所有操作都h-b线程的终止坚持

8.对象创建的h-b原则:一个对象的初始化完成先于它的finalize方法调用

 

    happen-before理解为:“生效可见于”“先于什么发生”,它和时间没有关系,只是前者的结果对于后者可见。这个原则是给程序员的看的,它的具体实现是编译器和处理品禁止一些重排序。(这里就涉及到了原子操作)

 

 

八大原则参考链接:     https://www.jianshu.com/p/b9186dbebe8e

                                   https://www.jianshu.com/p/8c6efbb80e5d(简书)

 

内存屏障参考链接:1. https://www.jianshu.com/p/08a0a8c984ab(入门版)

                2. http://ifeve.com/memory-barriers-or-fences/(详细 一点)

                3. https://www.cnblogs.com/straybirds/p/8856726.html(超详细)

                4. https://zhuanlan.zhihu.com/p/33626920(知乎)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值