CPU中缓存与主存的一致性是如何解决的,什么时候失效?

线程间的可见性问题根本上在于cache的不一致,那么为什么主存中的值已经改了,缓存的值不会同步修改或者立即失效呢?

寄存器呢?寄存器上缓存的值也是这样的么?

阅读 3.4k
1 个回答

clipboard.png

clipboard.png

在Java并发编程之美这本书里面讲了这个问题,个人认为这个例子解释的意思是说线程A更新主内存的时候只会立刻刷新L2 Cache和它自己的L1 Cache,线程B的L1 Cache是不会刷新的。现在就是A进来修改了变量x=1,然后A自己的L1 Cache和L2 Cache也都修改为1,然后B进来修改x=2后,B自己的L1 Cache和L2 Cache都改为了2,但是A的L1 Cache没有改,还是1,然后A进来的时候发现自己的L1 Cache有值就不会去查找主内存了,这样获取的值就有问题了。

================

至于解决方式,是提供了代码层面的解决方法,使用synchronized和volatile关键字后,写入一个线程执行完后立刻把缓存的值写会主内存,读的话则是不读缓存的值,直接读主内存的值,这样就可以避免这个问题。而其中synchronized是保证原子性的,因为每次只能有一个线程执行synchronized块代码,volatile则不是,所以如果是多线程还是有可能会发生并发问题。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题