请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

对于共享变量的读取

图片描述
悟空老师你好,有个问题想请问一下。
比如说现在主内存有变量x=0,首先线程1从主内存拷贝变量x=0到本地内存,然后执行x++,此时x=1,再同步回主内存。接着线程2开始了,从主内存中拷贝x=1到本地内存,然后也执行x++,此时x=2,再同步到主内存中。
由于上面的步骤,线程1和线程2都是第一次去访问变量x,所以自然都是先访问主内存,从主内存你中拷贝副本到本地内存中去操作变量。
当上面两个步骤做完之后,主内存x=2,线程1本地内存x=1,线程2本地内存x=2。此时线程1想再次访问变量x,将变量x的值加1。那么线程1是直接访问本地内存中x=1这个副本,还是说去访问主内存中x=2这个变量呢?
我的意思就是说当线程第一次访问某一个共享变量时,肯定都是先去从主内存中拷贝一份副本到自己的工作内存的。但如果是第二次或者第三次去访问这个变量时,这个线程如何决定是去访问主内存中的变量,还是访问自己本地内存中的变量呢?
因为缓存的出现就是为了让内存的读写速度能够尽量匹配上cpu的执行速度,所以访问变量时首选是从缓存中去读取。那么是不是有可能存在某种机制,比如说线程会先对比自己本地内存中的副本变量的值跟主内存中相应变量的值是否相同,如果相同,那我直接访问本地内存的变量,如果不相同,那我就把本地内存这个副本变量删掉,然后重新去主内存中拷贝一份来访问。
又或者是当一个线程修改了某个共享变量的值之后,在将这个变量同步回主内存的时候,会通知其他线程下次访问这个变量时记得去主内存中访问这种机制。

语言表达能力有点弱,希望能让老师看懂我的意思

正在回答

2回答

小伙伴的思考很超前,给小伙伴点赞:

比如说线程会先对比自己本地内存中的副本变量的值跟主内存中相应变量的值是否相同,如果相同,那我直接访问本地内存的变量,如果不相同,那我就把本地内存这个副本变量删掉,然后重新去主内存中拷贝一份来访问。
又或者是当一个线程修改了某个共享变量的值之后,在将这个变量同步回主内存的时候,会通知其他线程下次访问这个变量时记得去主内存中访问这种机制。

这个就类似于volatile的作用,小伙伴可以看下后面的小节,有详细讲解的。


另外,CPU会尽力保证缓存的一致,只要有机会,CPU都会把最近的主存的值刷到各线程的内存,并且有一些情况是要求必须保证可见性,那就是happens-before,在下面的小节马上就有讲到。

2 回复 有任何疑惑可以回复我~
  • 提问者 慕码人6675941 #1
    谢谢老师的解答,提出这个问题的时候只知道被volatile修饰的变量每次修改之后会被强制更新到主内存,却不知道被volatile修饰的变量在每次被线程访问时,都强迫从主内存中重读该成员变量的值,所以才有这个疑问。马上就继续往下边看~
    回复 有任何疑惑可以回复我~ 2019-09-15 21:18:31
慕沐0177137 2019-09-15 19:17:38

这个不就是 happens-before 原则吗?
你可以继续往下看

0 回复 有任何疑惑可以回复我~
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信