• 对Happens-Before的理解


    Happens-Before

    Happens-Before 是一种可见性模型,也就是说,在多线程环境下。原本因为指令重排序的存在会导致数据的可见性问题,也就是 A 线程修改某个共享变量对 B 线程不可见。因此,JMM 通过 Happens-Before 关系向开发人员提供跨越线程的内存可见性保证。如果一个操作的执行结果对另外一个操作可见,那么这两个操作之间必然存在Happens-Before 管理。其次,Happens-Before 关系只是描述结果的可见性,并不表示指令执行的先后顺序,也就是说只要不对结果产生影响,仍然允许指令的重排序。

    Happens-Before 规则

    在 JMM 中存在很多的 Happens-Before 规则:
    程序顺序规则,一个线程中的每个操作,
    • happens-before 这个线程中的任意后续操作,可以简单认为是 as-if-serial也就是不管怎么重排序,单线程的程序的执行结果不能改变
    • 传递性规则(如图),也就是 A Happens-Before B,B Happens-Before C。就可以推导出 A Happens-Before C。

    • volatile 变量规则,对一个 volatile 修饰的变量的写一定 happens-before 于任意后续对这个 volatile 变量的读操作
    • 监视器锁规则(如图),一个线程对于一个锁的释放锁操作,一定 happens-before 与后续线程对这个锁的加锁操作在这个场景中,如果线程 A 获得了锁并且把 x 修改成了 12,那么后续的线程获得锁之得到的 x 的值一定是 12

    • 线程启动规则(如图),如果线程 A 执行操作 ThreadB.start(),那么线程 A 的ThreadB.start()之前的操作 happens-before 线程 B 中的任意操作。在这样一个场景中,t1 线程启动之前对于 x=10 的赋值操作,t1 线程启动以后读取 x的值一定是 10.

    • join 规则(如图),如果线程 A 执行操作 ThreadB.join()并成功返回, 那么线程 B 中的任意操作 happens-before 于线程 A 从 ThreadB.join()操作成功的返回。

  • 相关阅读:
    QT 完成登陆界面跳转到聊天室+完成学生管理系统的查找和删除功能
    MVC第三波书店实现用户评论展示
    04-流媒体-ffmpeg.c源码分析
    Python自定义排序及实际遇到的一些实例
    cuDNN安装成功
    设计模式(八)——装饰者模式
    android 创建桌面快捷方式 ShortCut
    论文阅读笔记 | 三维目标检测——PointNet++
    【2023/10/16 下午10:32:39】
    神经网络入门
  • 原文地址:https://blog.csdn.net/qq_63431773/article/details/134097475