JAVA并发编程(3):并发编程中的内存可见性问题

发布时间:2022-06-26 发布网站:脚本宝典
脚本宝典收集整理的这篇文章主要介绍了JAVA并发编程(3):并发编程中的内存可见性问题脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。

内存可见性问题

JAVA并发编程(3):并发编程中的内存可见性问题

常见的CPU架构如图所示,当一个线程操作共享变量时,首先将该变量从主内存中读取到自己的工作内存(L1,L2 Cache),处理完之后,再将变量写回到主内存中。

现在假设有一个共享变量X,值为0,线程A首先获取变量X的值,由于L1,L2 Cache都没有命中,将从主内存中加载变量X到L2,L1 Cache中,然后将变量X的值改写为1,并写入到L1,L2 Cache以及主内存中,到目前为止,都没有问题,

然后线程B也获取变量X的值,B的L1 Cache没有命中,但在L2 Cache中命中了(A写入的),并将X加载到B的L1 Cache,B将X改写为2,并将X写回到L1,L2 Cache以及主内存中,到目前为止仍然没有问题,

随后,A又需要修改X的值,其在L1缓存中命中了X,但X=1,这时问题出现了,B线程已将X修改为2,但线程A获取的仍然是1,这就是多线程并发中的内存不可见问题,即一个线程写入的值对其他线程不可见。

 

java中的volatile关键字就是为了解决共享变量的内存不可见问题,当一个变量被声明为volatile时,线程在写入该变量时,不会将该变量缓存在寄存器或缓存中,而是会直接写入到主内存中;线程在读取该变量时,会直接从主内存获取值,而不是从缓存中,这样就保证了一个线程写入volatile变量,其他线程能够获取到最新值,从而解决内存不可见问题。

脚本宝典总结

以上是脚本宝典为你收集整理的JAVA并发编程(3):并发编程中的内存可见性问题全部内容,希望文章能够帮你解决JAVA并发编程(3):并发编程中的内存可见性问题所遇到的问题。

如果觉得脚本宝典网站内容还不错,欢迎将脚本宝典推荐好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。