Java - 多线程CPU缓存

时间:2014-04-01 01:27:50

标签: java multithreading caching

我知道线程会在运行它的cpu缓存中保存变量的值,因为这样,当需要在变量中获取值时,cpu不会等待太多时间。

但是,例如,如果我有这个对象

public class MyObject {
    int a = 2;
}

现在线程做了这样的事情:

MyObject obj = new MyObject();
obj.a=3;

我的问题是:
什么将保存在CPU缓存中? 所有MyObject结构还是只是参考? 我认为所有的结构(更有意义),但我更愿意问,因为我想确定这一点。

我是一个关于多线程的菜鸟,我确信cpu缓存的工作方式会更复杂,但目前我只需要基本的信息。

2 个答案:

答案 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变量。