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 将原语写入堆栈或堆?_Java_Multithreading_Primitive - Fatal编程技术网

Java 将原语写入堆栈或堆?

Java 将原语写入堆栈或堆?,java,multithreading,primitive,Java,Multithreading,Primitive,我今天参加了一个工作面试。 在一个问题上,面试官问我一个线程读取另一个线程设置的整数值需要多长时间?微秒?毫秒甚至一秒钟 他告诉我,如果是长值,它甚至可以达到一秒钟,因为“长值首先写入堆栈,但读取线程从堆中读取,因此要读取的值应该首先复制到堆中”,而对于长值,它可能需要很多时间 有没有人能告诉我,我是否理解正确,并解释一下 谢谢 一个线程读取另一个线程设置的整数值需要多长时间?微秒?毫秒甚至一秒钟 这取决于很多因素。如果问题是关于volatileint与long字段的比较,那么现代CPU上的答案

我今天参加了一个工作面试。 在一个问题上,面试官问我一个线程读取另一个线程设置的整数值需要多长时间?微秒?毫秒甚至一秒钟

他告诉我,如果是长值,它甚至可以达到一秒钟,因为“长值首先写入堆栈,但读取线程从堆中读取,因此要读取的值应该首先复制到堆中”,而对于长值,它可能需要很多时间

有没有人能告诉我,我是否理解正确,并解释一下

谢谢

一个线程读取另一个线程设置的整数值需要多长时间?微秒?毫秒甚至一秒钟

这取决于很多因素。如果问题是关于
volatile
int
long
字段的比较,那么现代CPU上的答案通常仍然是微秒。实际上,如果该字段没有来自其他线程的频繁访问,那么它的性能可能非常接近于正常读取。但是,如果变量受到严重竞争,则它的成本可能会显著增加,这取决于缓存失效和内存线锁定的成本。当然,如果您正在访问
synchronized
块内的字段,那么它取决于线程之间的锁争用以及块中的其他操作

例如,在我的4核Mac上,运行10个线程,所有线程都递增一个
volatile int
,它们可以在约190ms内完成100万个
++
。如果我的数学正确的话,那就是每分钟约0.19微秒。当然,这在任何方面都不是科学的,但它应该会让你对规模有一些了解。更改为
volatile long
并没有对数字造成太大的改变,但我运行的是本机64位系统和JVM。同样,在具有大量缓存内存的大型应用程序中,性能受到的影响可能会接近毫秒,但不会接近秒

为便于比较,它可以在约1300ms内以
AtomicInteger
的速度递增,在约1400ms内以100万
AtomicLong
的速度递增。同样,这些数字是一个非常简单的测试程序中的近似值

他告诉我,如果是长值,它甚至可以达到一秒钟,因为“长值首先写入堆栈,但读取线程从堆中读取,因此要读取的值应该首先复制到堆中”,而对于长值,它可能需要很多时间

这没有多大意义。
int
long
之间的唯一区别在于
long
可以根据您的运行时体系结构进行多次访问。例如,如果您使用的是32位体系结构,则可能需要多次访问才能读取和更新64位值。但是仅仅因为一个
长的
是宽度的两倍,访问它就需要几秒钟的想法是无效的

一个线程读取另一个线程设置的整数值需要多长时间

正如其他人所提到的,如果这是指当一个线程看到另一个线程中的变量发生不同步更新时,答案肯定是秒,但这与变量的宽度无关,与堆栈和堆之间的复制无关

一个线程读取另一个线程设置的整数值需要多长时间?微秒?毫秒甚至一秒钟

这取决于很多因素。如果问题是关于
volatile
int
long
字段的比较,那么现代CPU上的答案通常仍然是微秒。实际上,如果该字段没有来自其他线程的频繁访问,那么它的性能可能非常接近于正常读取。但是,如果变量受到严重竞争,则它的成本可能会显著增加,这取决于缓存失效和内存线锁定的成本。当然,如果您正在访问
synchronized
块内的字段,那么它取决于线程之间的锁争用以及块中的其他操作

例如,在我的4核Mac上,运行10个线程,所有线程都递增一个
volatile int
,它们可以在约190ms内完成100万个
++
。如果我的数学正确的话,那就是每分钟约0.19微秒。当然,这在任何方面都不是科学的,但它应该会让你对规模有一些了解。更改为
volatile long
并没有对数字造成太大的改变,但我运行的是本机64位系统和JVM。同样,在具有大量缓存内存的大型应用程序中,性能受到的影响可能会接近毫秒,但不会接近秒

为便于比较,它可以在约1300ms内以
AtomicInteger
的速度递增,在约1400ms内以100万
AtomicLong
的速度递增。同样,这些数字是一个非常简单的测试程序中的近似值

他告诉我,如果是长值,它甚至可以达到一秒钟,因为“长值首先写入堆栈,但读取线程从堆中读取,因此要读取的值应该首先复制到堆中”,而对于长值,它可能需要很多时间

这没有多大意义。
int
long
之间的唯一区别在于
long
可以根据您的运行时体系结构进行多次访问。例如,如果您使用的是32位体系结构,则可能需要多次访问才能读取和更新64位值。但是仅仅因为一个
长的
是宽度的两倍,访问它就需要几秒钟的想法是无效的

一个线程读取另一个线程设置的整数值需要多长时间

正如其他人所提到的,如果这是指当一个线程看到另一个线程中的变量发生不同步更新时,答案可能是c