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