“值却可能不一样(工作内存拷贝)。。。变量地址的引用为什么又一样?”
你是不是想说值拷贝。
先说这种机械运行的基本方式是基于栈(可以了解为什么不能基于寄存器)。然后需要认清堆和栈,什么是静态分配,什么是动态分配。你把调试的堆栈信息 —— 自己想办法实现一次这种堆栈信息抓取应该就比较清楚了。你会看清楚这“无尽”{},实际就是栈的体现。至于堆 —— 跟那么多所谓的池是一个道理,当某些东西又浪费资源,但又是用一下(一会儿),是不是都要搞个池的之类的集合管理。这个一样的,比如c有malloc、c++有new一样,new的含义就是从堆分配一片内存并返回一个地址,至于这种托管的,引用一次加1,既然要自动,当然=0的时候再加上其他触发的条件就从这个“池”扔弃,以便后来者有资源可以继续使用这个“池”。这也跟你用个变量全局和局部(动态)一个道理。
多线程下,数据不一致肯定使用的不是同一个存储空间位置(共享数据到线程工作內存了)。所以打印显示的地址引用是主存对应的空间,而线程使用的并不是这份空间的数据,而是使用自己工作内存的这份数据。而这份数据的空间,每个线程肯定不一样是独一无二的一份。多线程下显示的却是主存这份空间的地址引用 概念就很冲突
多线程情况下,CPU会维护一份内存的缓存
这就是顶层与底层的差别了。 java内存模型规定,具体执行时,线程的工作内存中保存了变量的副本,而且只能用这个副本进行计算。但是对我们来说,变量就只是存在主内存中,变量地址也只是主内存的地址。
差不多是这意思。各线程使用的不是同一空间位置(同一空间位置数据不可能不一致),显示的又是同一地址引用(主存变量对应的空间),不如直接显示自己线程使用那份位置的地址引用。显示的这份空间的引用使用的却不是这份空间(线程工作的某空间位置)的数据也是有点概念冲突
@守望者zzz: 工作线程的数据备份,我理解是一种缓存策略。本身对于java语言使用者来说,一个变量的多个备份,没有太多的好处。