我知道线程会在运行它的cpu缓存中保存变量的值,因为这样,当需要在变量中获取值时,cpu不会等待太多时间。
但是,例如,如果我有这个对象
public class MyObject {
int a = 2;
}
现在线程做了这样的事情:
MyObject obj = new MyObject();
obj.a=3;
我的问题是:
什么将保存在CPU缓存中?
所有MyObject
结构还是只是参考?
我认为所有的结构(更有意义),但我更愿意问,因为我想确定这一点。
我是一个关于多线程的菜鸟,我确信cpu缓存的工作方式会更复杂,但目前我只需要基本的信息。
答案 0 :(得分:0)
在您的示例中,只有一个线程正在执行。对于此线程,缓存是透明的 - 无法确定值是在缓存中,主内存中还是两者中。首先,所有值都放在缓存中,但很快就会在未知的时刻被推出。
“我想确定一下” - 为什么?您的程序行为不依赖于此。
答案 1 :(得分:0)
这些问题有两个方面:
CPU正在做什么:CPU旨在将所有内容保存在经常需要的缓存中。如果更改一个值,它将保留缓存中的更改,直到需要将其写入主内存(实际上它取决于CPU策略回写与直写)。将其写入主存储器的“需要”是以编程方式控制的,或者CPU决定其需要的其他空间。回答问题的一部分:对于CPU,一切都是数据,您在Java中设置的值以及内部对象数据结构。要访问您的值,首先需要对象地址,因此很可能在缓存中:)
第二点,是Java程序员应该期待和不期望的:这在Java内存模型中已经非常精确地定义了。从这里开始:http://en.wikipedia.org/wiki/Java_Memory_Model
所以对你的台词来说:
MyObject obj = new MyObject();
obj.a=3;
无法保证在此代码之后运行的另一个线程会看到新值。它也可能看不到你的新对象引用,而是null。您需要一个synchronized块或一个volatile变量。