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不能阻止指令交错
它只能保证线程内部的有序性,多线程之间的指令排序它无法控制

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值