• Java多线程之 happens-before


    什么是happens-before

    happens-before用来保证两个操作直接的可见性。
    这里的两个操作,即可以在一个线程,也可以在多个线程中。

    具体定义:

    1.如果一个操作happens-before另一个操作,那么第一个操作的执行结果,将对第二个操作可见。(保证可见性)
    而且第一个操作的执行顺序排在第二个操作之前。(JMM对程序做出的逻辑保障,并不是代码指令真正的执行保证)
    2.即使两个操作之间存在happens-before关系,并不意味着Java平台的实现必须要按照happens-before关系指定的顺序执行。

    因此,
    第一条是JMM对于程序员做出的一个逻辑保障。
    第二条是JMM对编译器,处理器重排序的约束原则。只要不改变程序的执行结果(不管是单线程还是多线程)。编译器,处理器怎么优化都可以。

    happens-before规则

    一个线程中的每个操作happens-before该线程中任意后续操作。

    监视器锁规则

    对一个锁的解锁操作happens-before随后对这个锁的加锁。

    volatile变量规则

    对volatile修饰的字段进行的写操作happens-before任意后续对这个volatile修饰的字段进行的读操作。
    如下面的代码,run方法的第一行一定happens-beforerun方法的第二行。在多线程环境下也是如此。在每次对num赋值的时候,会强制刷新进主内存。让其它缓存持有num失效。

    private volatile int num=0;
    //新线程 
    void run(){
           num=9;
           int a=num;
    }
     
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    传递性

    其实这个非常好理解,没什么好说的,第一行happens-before第二行,第二行happens-before第三行,那么第一行happens-before第三行

    int a=1;
    int b=6;
    int c=a=b;
    
    • 1
    • 2
    • 3

    start规则

    如果在线程A里面去执行线程B的start,那么在线程A里面的B.start()操作happens-before线程B中的任意操作。
    这个是非常好理解的。写过多线程一看就明白。

    join规则

    如果在线程A里面去执行线程B.join(),那么在线程B里面的任意操作 happens-before线程A中执行了线程B.join()之后的操作。
    没什么好说的,就是把join的特性说了一遍。

  • 相关阅读:
    C语言assert断言
    StartDT奇点云通过CMMI5全球软件领域最高级别成熟度认证
    Bean管理注解
    一个简单高效低内存的.NET操作Excel开源框架 - MiniExcel
    guzzle http/guzzle如何在鉴权中使用,如何使用异步操作?
    0基础跟我学python---进阶篇(1)
    懒人方案--半天搞定一个SpringBoot单体项目
    Vue 和 React 前端框架的比较
    164页5万字轨道交通BIM方案建议书
    Codeforces Round #821 (Div. 2)(A~E)
  • 原文地址:https://blog.csdn.net/ScottePerk/article/details/125532241