0

假设您有一个工作队列,并且可能有数千个工作项。并假设不同工作项的更新不断进入系统。现在很明显,如果我们为同一个工作项获得多个更新,则需要锁定。

在这种情况下,我们很容易遇到这样一种情况,系统可能一次接收到 2000 个(或一些高数量)更新,因此 JVM 需要在不同对象上持有 2000 个锁。

它会大大降低 JVM 性能吗?是否有 JVM 可以一次持有的最大锁数以防止性能下降。

我知道您可以使用散列技术来阻止锁的数量增加。

4

2 回答 2

1

多核场景中的任何锁定都涉及原子内存操作,即一个核心看到另一个核心写入的数据(在写入之后)。这些数据必须由一个核心推送到内存(告诉所有其他核心的缓存,无论他们知道这个值是无效的,必须刷新)并在另一个核心读入。这种情况发生的速度在 CPU 架构及其实现之间有很大差异。一般来说,单插槽机器在这方面应该比多插槽机器更快。


因此,正如 SimonC 所说,您需要编写一个测试。

于 2013-01-17T18:20:50.700 回答
1

每个锁只存储持有它的对象。问题的第一部分——JVM 可以持有多少锁——就像询问12它可以存储多少 s。数量受内存限制。正如其他人所指出的,锁争用对性能的影响最大。

使用类java.util.concurrent来构建和存储您的锁和工作队列,因为它们是为安全和性能而编写的。我强烈推荐Java Concurrency in Practice一书。

于 2013-01-17T20:04:21.993 回答