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,哈哈哈哈 好玩吗??