volatile 保证线程之间可见性 和 缓存

1.保证线程之间可见性
可见性是线程本地的缓存!!!!!不是ThreadLocal.!!!!
是互相之间保持数据一致性的机制。

flag 在内存中,一个线程对他进行访问,把这个值是赋值给他自己的本地内存,在主线程中把flag 值设置成false,但是其他线程见不到~!
在这里插入图片描述

cache line 缓存行 对齐 伪共享
缓存是一行一行读取缓存行的内容。
当你定义一个long 类型 和 定义 8个long类型时候,程序运行速度将不一样!!! 定义8个long类型速度将更快!!诡异的现象来自于不同线程之间走亲访友,当刚好赛一块时,就不会去啦!

CPU 到内存之中有很多缓存 ,L1,L2,L3,主存。数据是按块读,内存块(cache line )!!一行数据64字节!!

缓存行效率证明
在这里插入图片描述
在这里插入图片描述

系统底层如何实现数据一致性
1.MESI能解决就用它,
2.锁总线(当数据很多,超过缓存行,在cpu 访问一块内存时,其他CPU 锁住 不允许访问)

系统底层如何保证有序性
1.内存屏障
2.锁总线

MESI :CPU 之前的数据一致性协议(不同cpu之间协议不一定一样!)
cache line 4种状态
1.modified: 修改
2.exclusive:独有
3.shared:共享
4.invalid:失效

这个是证明程序 无序性的很好的例子,他可以在1972次打印出 a=0和b=0,哈哈哈哈 好玩吗??
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值