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