Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java多线程CPU缓存_Java_Multithreading_Caching - Fatal编程技术网

Java多线程CPU缓存

Java多线程CPU缓存,java,multithreading,caching,Java,Multithreading,Caching,我知道线程将变量的值保存在它运行的cpu缓存中,因为这样cpu就不会在需要获取变量中的值时等待太久 但是举个例子,如果我有这个物体 public class MyObject { int a = 2; } 现在线程执行如下操作: MyObject obj = new MyObject(); obj.a=3; 我的问题是: cpu缓存中将保存什么? 所有MyObject结构还是仅参考? 我认为所有的结构都更有意义,但我更愿意问,因为我想确定这一点。 我对多线程一无所知,我确信cpu缓存

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

但是举个例子,如果我有这个物体

public class MyObject {
    int a = 2;
}
现在线程执行如下操作:

MyObject obj = new MyObject();
obj.a=3;
我的问题是: cpu缓存中将保存什么? 所有MyObject结构还是仅参考? 我认为所有的结构都更有意义,但我更愿意问,因为我想确定这一点。
我对多线程一无所知,我确信cpu缓存的工作原理更复杂,但目前我只需要基本信息。

在您的示例中,只有一个线程在工作。对于这个线程,缓存是透明的——无法确定值是在缓存中,还是在主内存中,或者两者都在。首先,所有值都放在缓存中,但很快,在未知时刻,它们就会被推出


我想确定一下,为什么?您的程序行为不依赖于此。

这些问题有两个方面:

CPU正在做什么:CPU被设计成将经常需要的所有东西都保存在缓存中。如果您更改一个值,它将保留缓存中的更改,直到需要将其写入主内存为止。实际上,这取决于CPU策略回写与直写。将其写入主存的需要是通过编程控制的,或者CPU描述了它对其他内容所需的空间。回答问题的一部分:对于CPU来说,一切都是数据、Java中设置的值和内部对象数据结构。要访问您的值,首先需要对象地址,因此该地址很可能也在缓存中:

第二点是Java程序员应该期望和不期望的:这在Java内存模型中定义得非常准确。从这里开始:

所以对于你的台词:

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

无法保证在此代码之后运行的另一个线程会看到新值。它也可能看不到您的新对象引用,而是null。您需要一个同步块或可变变量。

关于我知道的脏读数。。。这是正常的,因为如果没有同步,cpu的共享变量和可变变量的值可能不同。但是如果我明白你写了什么。。。在缓存中保存:对象的引用和他的结构对吗?这是因为如果只是参考。。。我们需要在主内存上的堆上捕获保存在缓存中的引用上的内容。。。正当那么缓存中保存的是引用,结构对象是对的?Giovanni,你走错了方向。保存和缓存是两个不同的概念。缓存中从未保存任何内容。缓存只保存可能在不久的将来再次需要或修改的数据。这不仅是数据,也是CPU指令代码。请看:@GiovanniFar,注意cruftex回答中的第2段。您根本不应该考虑缓存。编写Java程序时,唯一重要的是Java内存模型。当您试图理解JVM本身如何工作时,您可以谈论缓存,当您试图理解其他非托管代码(例如C/C++)时,您可以谈论缓存,但当您试图理解Java程序时谈论缓存是错误的。Java内存模型解释了这种情况下的所有问题。