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

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

1个回答

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

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问