首页 新闻 会员 周边 捐助

java 地址引用和存储空间的对应关系是一对一吗?

0
悬赏园豆:50 [待解决问题]

共享变量在多线程下,变量地址一样,值却可能不一样(工作内存拷贝),就是变量的存储空间不一样吗?既然存储空间不一样 变量地址的引用为什么又一样?
共享变量地址的引用都是主存存储空间的引用?这个拷贝后的存储空间和主存存储空间的关系维护(主存变量和拷贝变量的存储空间的关系维护)

问题补充:

一份数据对应一份空间对应一个地址引用。各自线程使用不同空间却显示同一引用(主存变量的空间),有点概念冲突

守望者zzz的主页 守望者zzz | 初学一级 | 园豆:152
提问于:2019-12-26 23:14
< >
分享
所有回答(3)
0

“值却可能不一样(工作内存拷贝)。。。变量地址的引用为什么又一样?”

你是不是想说值拷贝。

先说这种机械运行的基本方式是基于栈(可以了解为什么不能基于寄存器)。然后需要认清堆和栈,什么是静态分配,什么是动态分配。你把调试的堆栈信息 —— 自己想办法实现一次这种堆栈信息抓取应该就比较清楚了。你会看清楚这“无尽”{},实际就是栈的体现。至于堆 —— 跟那么多所谓的池是一个道理,当某些东西又浪费资源,但又是用一下(一会儿),是不是都要搞个池的之类的集合管理。这个一样的,比如c有malloc、c++有new一样,new的含义就是从堆分配一片内存并返回一个地址,至于这种托管的,引用一次加1,既然要自动,当然=0的时候再加上其他触发的条件就从这个“池”扔弃,以便后来者有资源可以继续使用这个“池”。这也跟你用个变量全局和局部(动态)一个道理。

花飘水流兮 | 园豆:13595 (专家六级) | 2019-12-27 02:15

多线程下,数据不一致肯定使用的不是同一个存储空间位置(共享数据到线程工作內存了)。所以打印显示的地址引用是主存对应的空间,而线程使用的并不是这份空间的数据,而是使用自己工作内存的这份数据。而这份数据的空间,每个线程肯定不一样是独一无二的一份。多线程下显示的却是主存这份空间的地址引用 概念就很冲突

支持(0) 反对(0) 守望者zzz | 园豆:152 (初学一级) | 2019-12-29 00:09
0

多线程情况下,CPU会维护一份内存的缓存

yytxdy | 园豆:1680 (小虾三级) | 2019-12-27 10:12
0

这就是顶层与底层的差别了。 java内存模型规定,具体执行时,线程的工作内存中保存了变量的副本,而且只能用这个副本进行计算。但是对我们来说,变量就只是存在主内存中,变量地址也只是主内存的地址。

授之以渔 | 园豆:1107 (小虾三级) | 2019-12-27 15:44

差不多是这意思。各线程使用的不是同一空间位置(同一空间位置数据不可能不一致),显示的又是同一地址引用(主存变量对应的空间),不如直接显示自己线程使用那份位置的地址引用。显示的这份空间的引用使用的却不是这份空间(线程工作的某空间位置)的数据也是有点概念冲突

支持(0) 反对(0) 守望者zzz | 园豆:152 (初学一级) | 2019-12-29 00:32

@守望者zzz: 工作线程的数据备份,我理解是一种缓存策略。本身对于java语言使用者来说,一个变量的多个备份,没有太多的好处。

支持(0) 反对(0) 授之以渔 | 园豆:1107 (小虾三级) | 2019-12-31 14:50
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册