volatile的可见性和有序性原理理解

这里主要讲解volatile保证指令有序性的理解

有序性底层是通过读屏障和写屏障实现的(这也是可见性的实现原理)
读屏障保证volatile修饰的变量被读取的时候,它后面存在其他共享变量被读取的代码时,都是从主存中读取的,而不是从线程缓存中读取
如:

public void actor1(I_Result r) {
    
    
    if(ready) {
    
    //读屏障
        r.r1 = num + num;
    } else {
    
    
        r.r1 = 1;
    }
}

写屏障保证volatile修饰的变量在赋值的时候,它前面存在其他共享变量被赋值的代码时,都是要写入主存的,而不是写入线程缓存中
如:

public void actor2(I_Result r) {
    
    
    num = 2;
    ready = true;//写屏障
}

总结为:
读之后的代码不会出现在volatile变量之前
写之前的代码不会出现在volatile变量之后

注意:
通过上面我们可以推理出,
读之前的代码可能出现在读之后
写之后的代码可能出现在写之前
这个我已经用代码验证了,确实存在
所以,volatile不能阻止指令交错
它只能保证线程内部的有序性,多线程之间的指令排序它无法控制

猜你喜欢

转载自blog.csdn.net/Brave_heart4pzj/article/details/113832944
今日推荐