线程间的可见性问题根本上在于cache的不一致,那么为什么主存中的值已经改了,缓存的值不会同步修改或者立即失效呢?
寄存器呢?寄存器上缓存的值也是这样的么?
线程间的可见性问题根本上在于cache的不一致,那么为什么主存中的值已经改了,缓存的值不会同步修改或者立即失效呢?
寄存器呢?寄存器上缓存的值也是这样的么?
4 回答1.3k 阅读✓ 已解决
4 回答1.2k 阅读✓ 已解决
1 回答2.5k 阅读✓ 已解决
1 回答978 阅读✓ 已解决
1 回答707 阅读✓ 已解决
2 回答718 阅读✓ 已解决
3 回答722 阅读✓ 已解决
在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则不是,所以如果是多线程还是有可能会发生并发问题。