volatile锁在上一个文章中介绍到是一个只对变量修饰的锁。
被volatile修饰的变量在被一个线程读取并修改之后,另一个线程之前读取的数据是无效的,volatile保证第二个线程读到的数据是刷新修改之后的数据。
但是他只能保证,当前读到的结果是正确的,但是无法保证,最后的结果是无法保证正确性的,因为他对自加加是无效的。
有volatile变量修饰的共享变量进行写操作的时候会所处第二行汇编代码,可以通过查看IA-32架构软件开发者手册可知。
(volatile如何保证数据读取正确性,如何清理缓存?)
我们在缓存行中的数据一定是包含他来自内存中的那个地址的,当CPU修改完成数据进行内存刷新的时候,按照存储的地址进行刷新。此时总线按照地址刷新数据的时候,同时也会按照地址匹配缓存行中的符合该地址的数据,使其无效。
在最近处理器中,lock信号一般不锁总线而是锁缓存,因为锁总线的开销比较大,如果锁总线,那么所有的线程就都不能使用总线了。
缓存一致性机制会阻止同时修改由两个以上处理器缓存的内存区域数据。也就是阻止两个线程同时往内存刷新。
缓存锁定:同缓存填充,如果缓存行是64B的,就将缓存行中的数据追加到64B,这样就可以避免缓存行中的其他数据堵塞。
最后表明一点,volatile修饰的变量都是会被频繁访问到的,如果访问不频繁的变量,根本就用不到volatile修饰。