之前一直不明白为什么一个线程修改了数据(不用volatile修饰),而另一个线程读取时还是之前的值,网上查找了一些资料做了个总结,纯属个人理解如有不对请指正


1.CPU缓存(Cache Memory)是位于CPU和内存之间的临时存储器,它的容量小但是数据交换速度很快。

2.内存:它的容量比较大,但是CPU访问内存的效率相对缓存较低

有了缓存和内存,内存储器(缓存+内存)就变成既有缓存的高速度又有内存的大容量的存储系统。


缓存工作原理:CPU读取一个数据时,会先从缓存中查找,如果没有找到才会从内存中查找。(CPU下次要读取的数据90%在缓存中,因此效率很高)

现在的CPU与内存之间一般都存在一级缓冲区、二级缓冲区,这样效率更高。


Write-back:CPU在改写了cache line后,并不是马上把其写回内存,而是将该cache line标志为dirty。只有当cache中发生一次cache miss,其他的数据要占用该cache line时,CPU才会把其写回内存。在实现write-back策略时,有一个重要的问题是需要被考虑到的,当多个处理器访问同一内存时,必须保证所有处理器所看到的内存内容是相同的,也就是一致性的问题。当一个cache line被一个处理器设置为dirty后,另一个处理器要访问同一内存,那么显然,该处理器真正需要的数据是前者的cache里的数据,而不是内存中还未更新的数据。

个人理解:

在多线程编程中,一个线程把数据更改了,而另一个线程读取这个数据还是之前的值,可能就是读取的是缓冲区中的值,而不是内存中的值,用关键字volatile修饰变量就是告诉CPU取值的时候直接从内存中获取(原子操作)