volatile理解

https://www.cnblogs.com/dolphin0520/p/3920373.html

 

volatile有两层语义:

1.保证多线程对变量操作时的可见性,即一个线程对变量修改后,对其他线程立刻可见。

2.禁止指令重排序。

第一点,在计算机内存模型上存在数据缓存一致性的问题。因为在执行程序时所有的指令都是在CPU上面进行执行的,指令执行过程中又会涉及到数据的读和写,由于数据存储在内存中,而CPU执行又非常快,从内存读取数据和向内存写入数据对于CPU执行来说是非常慢的会降低效率,因此CPU里面就多了一个高速缓存,将内存的数据提前读取到高速缓存中,然后CPU通过高速缓存进行数据的读写计算。执行完后再将数据刷新到内存中。

比如,两个线程同时执行一个语句 i=i+1

初始时,两个线程分别读取i的值存入各自所在的CPU的高速缓存当中,然后线程1进行加1操作,然后把i的最新值1写入到内存。此时线程2的高速缓存当中i的值还是0,进行加1操作之后,i的值为1,然后线程2把i的值写入内存。

最终结果i的值是1,而不是2。这就是著名的缓存一致性问题。通常称这种被多个线程访问的变量为共享变量。

也就说,一个变量在多个缓存中,就可能造成缓存一致性问题。

为了解决缓存一致性问题。,通常来说有以下2种解决方法:

1)通过在总线加LOCK#锁的方式

 2)通过缓存一致性协议

这两种方式都是从硬件层面上解决缓存一致性问题。

 

posted on   云中哥  阅读(32)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
历史上的今天:
2021-02-22 java 锁
2021-02-22 AQS基础——多图详解CLH锁的原理与实现

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

点击右上角即可分享
微信分享提示