将基元写入堆栈或堆?

时间:2017-11-28 17:53:35

标签: java multithreading primitive

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

他告诉我,在长值的情况下它甚至可以达到一秒,因为" long值首先写入堆栈但读取线程从堆中读取,因此要读取的值首先应该复制到堆"对于长期值,它可能需要很长时间。

有人可以告诉我,如果我理解正确并解释了一下吗?

谢谢!

1 个答案:

答案 0 :(得分:2)

  

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

取决于很多因素。如果问题是关于volatile intlong字段,那么通常在现代CPU上的答案仍然是微秒。如果字段没有来自其他线程的频繁访问,它实际上可以非常接近正常读取的性能。但是,根据高速缓存失效的成本和存储器行的锁定(如果变量严重争用),它可能明显更昂贵。当然,如果您正在访问synchronized块内的字段,那么它取决于线程之间的锁争用以及块中的其他操作。

例如,在我的4核心Mac上,运行10个线程全部递增volatile int,它们可以在~190ms内完成100万个++。如果我的数学是正确的,则每次0.19微秒。当然不是任何科学的科学,但它应该给你一些规模的想法。更改为volatile long并未更改数字,但我在本机64位系统和JVM上运行。同样,具有大量缓存内存的较大应用程序内部的性能可能会接近毫秒,但不会接近几秒。

为了进行比较,它可以在~1300ms内以{1300}增量AtomicInteger增量,在~1400ms内增量为1百万AtomicLong。同样,这些数字是一个非常简单的测试程序中的近似值。

  

他告诉我,在长值的情况下它甚至可以达到一秒,因为" long值首先写入堆栈但读取线程从堆中读取,因此要读取的值首先应该复制到堆"对于长期值,它可能需要很长时间。

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

  

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

正如其他人所提到的,如果这是在讨论当一个线程看到另一个线程中的变量的非同步更新时,答案当然可能是秒,但这与变量的宽度没什么关系与堆栈和堆之间的复制有关。