看网上很多文章对可见性的定义“普通的共享变量不能保证可见性,因为普通共享变量被修改之后,什么时候被写入主存是不确定的,当其他线程去读取时,此时内存中可能还是原来的旧值,因此无法保证可见性。”
那么问题来了,共享变量,不应该指存在堆区的变量吗,比如对象中的成员变量,那么在线程中(即栈中对共享变量)的修改是通过地址找到堆中的变量直接在堆中进行的修改,而且栈中只拥有堆中变量的索引地址,那么这个可见性又是怎么回事呢?? 可能对某些概念有误解,求
多线程可见性,共享变量的疑惑
- 写回答
- 好问题 0 提建议
- 追加酬金
- 关注问题
- 邀请回答
-
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 保护模式-系统加载-段寄存器