谈谈Java并发编程可见性问题

Java面试 潘老师 3个月前 (11-22) 69 ℃ (0) 扫码查看

本文主要讲解关于Java并发编程可见性问题相关内容,这个问题在面试过程中也会经常被问到,让我们来一起学习下吧!

今天看到pdai:

众所周知,CPU、内存、I/O 设备的速度是有极大差异的,为了合理利用 CPU 的高性能,平衡这三者的速度差异,计算机体系结构、操作系统、编译程序都做出了贡献,主要体现为:

  • CPU 增加了缓存,以均衡与内存的速度差异;// 导致 可见性问题
  • 操作系统增加了进程、线程,以分时复用 CPU,进而均衡 CPU 与 I/O 设备的速度差异;// 导致 原子性问题
  • 编译程序优化指令执行次序,使得缓存能够得到更加合理地利用。// 导致 有序性问题

但是这里的可见性这引起了我的问题,这咋和我之前看的黑马的并发编程不一样呢?

我之前跟着黑马记的可见性笔记是:

可见性

  • 什么是可见性问题:
    • 即一个线程对某共享变量修改后,另一个线程无法看到最新的变量值的情况
  • 为什么会产生可见性问题:
    • 主内存,本地内存:
      • 主内存:所有线程创建的实例对象(无论成员还是局部)
      • 本地内存:存储了该线程以读 / 写共享变量的副本
    • 因为不同线程之间的通信需要通过主存传递数据,当一个线程修改了共享变量,这个修改可能会存储在线程的本地缓存中,而不会立即同步到主内存中,因此其他线程可能无法立刻看到这个修改。
    • 也有一说是线程频繁读取主存中的值,JIT(just in time compiler)会直接将该值存入线程工作区(相当于线程的缓存),用来提高速度,所以此时即使其他线程修改了主内存中的值,此线程仍然读取自己的缓存,缓存没有得到即使更新。
  • 解决办法:
    • volatile:它可以用来修饰成员变量和静态成员变量,线程对于被volatile修饰的变量的操作总是直接操作主存,实现最新的修改和查询。

两者怎么还说法不同呢?

我问了gpt然后觉得应该是这样:

  • 首先二者的说法都没有问题,只是角度不同
  • cpu为什么需要缓存呢?
    • 就是为了解决cpu和内存之间的速度差异过大嘛,缓存的速度介于cpu和内存之间, 而且cpu的每个核都有三级缓存。
    • 将频繁使用的数据保存在缓存中,就无需费力地去内存之中加载了
  • 一个线程由cpu的一个核心来运行,所以线程的工作内存在物理上就是cpu的缓存
  • 线程在运行的时候就将数据存在自己cpu的缓存,即将数据存在自己的工作内存,因此发生了修改对于主内存也是不可见的
  • 那么在单核cpu下我觉得应该就不会发生可见性问题(应该?)

以上就是关于Java并发编程可见性问题相关的全部内容,希望对你有帮助。欢迎持续关注潘子夜个人博客(www.panziye.com),学习愉快哦!


版权声明:本站文章,如无说明,均为本站原创,转载请注明文章来源。如有侵权,请联系博主删除。
本文链接:https://www.panziye.com/javainterview/11743.html
喜欢 (0)
请潘老师喝杯Coffee吧!】
分享 (0)
用户头像
发表我的评论
取消评论
表情 贴图 签到 代码

Hi,您需要填写昵称和邮箱!

  • 昵称【必填】
  • 邮箱【必填】
  • 网址【可选】