qq_41422927 2019-01-04 09:50 采纳率: 0%
浏览 734

多线程可见性,共享变量的疑惑

看网上很多文章对可见性的定义“普通的共享变量不能保证可见性,因为普通共享变量被修改之后,什么时候被写入主存是不确定的,当其他线程去读取时,此时内存中可能还是原来的旧值,因此无法保证可见性。”
那么问题来了,共享变量,不应该指存在堆区的变量吗,比如对象中的成员变量,那么在线程中(即栈中对共享变量)的修改是通过地址找到堆中的变量直接在堆中进行的修改,而且栈中只拥有堆中变量的索引地址,那么这个可见性又是怎么回事呢?? 可能对某些概念有误解,求

  • 写回答

1条回答 默认 最新

  • lambda-fk 2019-01-04 10:05
    关注

    学过组成原理和操作系统吧,cpu和内存是如何交互的还是否有记忆
    堆,栈他们再如何特殊 也只是Java构造出的内存模型,范畴仍然在内存里面啊
    java程序是最终还是要被cpu执行的,那么变量的值本身是在内存中,程序的处理结果到内存之间可是有缓存的
    尤其是多核cpu,每个cpu都有自己的寄存器和缓存吧,这样一来所谓的修改必须要从cpu缓存到告诉缓存再到内存一个过程
    缓存中的值合适刷如内存当然不确定了。
    如果要对其他线程可见,那么至少cpuA处理之后必须要强制的将 缓存的值刷人内存之中,这就需要机器指令
    Java中老爱提的内存屏障就是干这个事情的。
    你想想为什么加了synchronized之后 前一个线程的处理结果对后一个取得锁的线程是可见的,根源就在于synchronized 最后会被翻译为
    内存屏障,强制从内存读以及写内存
    可以去看看内存屏障相关的,你就理解了

    评论

报告相同问题?

悬赏问题

  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 保护模式-系统加载-段寄存器