看网上很多文章对可见性的定义“普通的共享变量不能保证可见性,因为普通共享变量被修改之后,什么时候被写入主存是不确定的,当其他线程去读取时,此时内存中可能还是原来的旧值,因此无法保证可见性。”
那么问题来了,共享变量,不应该指存在堆区的变量吗,比如对象中的成员变量,那么在线程中(即栈中对共享变量)的修改是通过地址找到堆中的变量直接在堆中进行的修改,而且栈中只拥有堆中变量的索引地址,那么这个可见性又是怎么回事呢?? 可能对某些概念有误解,求
多线程可见性,共享变量的疑惑
- 写回答
- 好问题 0 提建议
- 追加酬金
- 关注问题
- 邀请回答
-
1条回答
- lambda-fk 2019-01-04 10:05关注
学过组成原理和操作系统吧,cpu和内存是如何交互的还是否有记忆
堆,栈他们再如何特殊 也只是Java构造出的内存模型,范畴仍然在内存里面啊
java程序是最终还是要被cpu执行的,那么变量的值本身是在内存中,程序的处理结果到内存之间可是有缓存的
尤其是多核cpu,每个cpu都有自己的寄存器和缓存吧,这样一来所谓的修改必须要从cpu缓存到告诉缓存再到内存一个过程
缓存中的值合适刷如内存当然不确定了。
如果要对其他线程可见,那么至少cpuA处理之后必须要强制的将 缓存的值刷人内存之中,这就需要机器指令
Java中老爱提的内存屏障就是干这个事情的。
你想想为什么加了synchronized之后 前一个线程的处理结果对后一个取得锁的线程是可见的,根源就在于synchronized 最后会被翻译为
内存屏障,强制从内存读以及写内存
可以去看看内存屏障相关的,你就理解了解决 无用评论 打赏 举报
悬赏问题
- ¥15 C++使用Gunplot
- ¥15 这个电路是如何实现路灯控制器的,原理是什么,怎么求解灯亮起后熄灭的时间如图?
- ¥15 matlab数字图像处理频率域滤波
- ¥15 在abaqus做了二维正交切削模型,给刀具添加了超声振动条件后输出切削力为什么比普通切削增大这么多
- ¥15 ELGamal和paillier计算效率谁快?
- ¥15 file converter 转换格式失败 报错 Error marking filters as finished,如何解决?
- ¥15 Arcgis相交分析无法绘制一个或多个图形
- ¥15 关于#r语言#的问题:差异分析前数据准备,报错Error in data[, sampleName1] : subscript out of bounds请问怎么解决呀以下是全部代码:
- ¥15 seatunnel-web使用SQL组件时候后台报错,无法找到表格
- ¥15 fpga自动售货机数码管(相关搜索:数字时钟)