假设您有一个工作队列,并且可能有数千个工作项。并假设不同工作项的更新不断进入系统。现在很明显,如果我们为同一个工作项获得多个更新,则需要锁定。
在这种情况下,我们可以很容易地遇到一种情况,即系统可能同时收到2000(或一些高数量)更新,因此JVM需要在不同对象上保存2000个锁。
它会降低JVM的性能吗?是否存在JVM一次可以容纳的最大锁数,以免性能下降。
据我所知,您可以使用散列技术来阻止锁定数量的增长。
答案 0 :(得分:1)
多核场景中的任何锁定都涉及原子内存操作,即一个核心看到由另一个核心写入的数据(在写入之后)。这些数据必须由一个核心推送到内存中(告诉所有其他核心的缓存,无论他们对此值的了解是否无效且必须刷新)并在另一个核心读入。这种情况发生的速度在CPU架构及其实现之间变化很大。一般来说,单插槽机器应该比多插座更快。
因此,正如SimonC所说,你需要写一个测试。
答案 1 :(得分:1)
每个锁只存储持有它的对象。问题的第一部分--JVM可以拥有多少个锁 - 就像询问它可以存储多少12
个。金额受记忆限制。正如其他人所指出的,性能受锁争用影响最大。
使用java.util.concurrent
中的类来构建和存储锁定和工作队列,因为它们是为了安全性和性能而编写的。我强烈推荐这本书Java Concurrency in Practice。