移除锁时Java性能下降

移除锁时Java性能下降,java,performance,Java,Performance,我正在测试java应用程序的性能瓶颈。应用程序使用concurrent.jar进行锁定 我有一个高计算调用,它调用锁定和解锁函数进行操作。 从代码中删除锁解锁机制后,我发现性能下降了很多倍,这与我的预期相反。观察到的其他事情包括CPU消耗的增加,这让我觉得程序运行得更快,但实际上并非如此 问题1。当我们移除锁时,性能下降的原因是什么 最好的问候 剖析它。这里的任何其他东西都只是猜测和未知 使用类似的探查器不仅可以告诉您哪些方法在CPU时间方面是“热点”,还可以告诉您线程在哪里花费了大部分时间阻塞

我正在测试java应用程序的性能瓶颈。应用程序使用concurrent.jar进行锁定

我有一个高计算调用,它调用锁定和解锁函数进行操作。 从代码中删除锁解锁机制后,我发现性能下降了很多倍,这与我的预期相反。观察到的其他事情包括CPU消耗的增加,这让我觉得程序运行得更快,但实际上并非如此

问题1。当我们移除锁时,性能下降的原因是什么


最好的问候

剖析它。这里的任何其他东西都只是猜测和未知


使用类似的探查器不仅可以告诉您哪些方法在CPU时间方面是“热点”,还可以告诉您线程在哪里花费了大部分时间阻塞或等待它。这里的任何其他东西都只是猜测和未知


使用像这样的探查器不仅可以告诉您哪些方法在CPU时间方面是“热点”,还可以告诉您线程在哪里花费了大部分时间被阻塞或等待

它是否仍然正确执行?例如,在一个应用服务器中,一个非同步的
HashMap
偶尔会导致无限循环。不难看出工作是如何简单地重复的。

它仍然正确地执行吗?例如,在一个应用服务器中,一个非同步的
HashMap
偶尔会导致无限循环。不难看出如何简单地重复工作。

当您删除共享内存保护时,最可能导致性能下降和CPU使用率增加的罪魁祸首是竞争条件。两个或多个线程可以在共享对象上不断地来回翻转状态标志


对应用程序用途的更多描述将有助于诊断。

当您删除共享内存保护时,最可能导致性能下降和CPU使用率增加的罪魁祸首是竞争状况。两个或多个线程可以在共享对象上不断地来回翻转状态标志


对应用程序用途的更多描述将有助于诊断。

这可能是一个非常常见的发现,具体取决于您正在做什么以及您正在使用什么作为锁的替代品

本质上,发生的事情是,像ReentrantLock这样的构造内置了一些逻辑,当它们实际上无法获得锁时,它们知道“何时退出”。这减少了在重复尝试获取锁的逻辑中消耗的CPU量,如果使用更简单的锁结构,可能会发生这种情况

举个例子,看一看我匆匆贴出的图表。它显示了使用不同的构造作为锁定机制不断访问数组随机元素的线程的吞吐量。沿X轴是螺纹的数量;Y轴是吞吐量。蓝线是一个可重入锁;黄色、绿色和棕色线条使用旋转锁的变体。请注意,在线程数较少的情况下,自旋锁的吞吐量可能会比您预期的更高,但随着线程数的增加,ReentrantLock的后退逻辑开始发挥作用,它最终会做得更好,而在高争用情况下,自旋锁只会占用CPU

顺便说一下,这实际上是在双处理器机器上进行的试运行;我也在亚马逊云上运行过它(实际上是一个8路Xeon),但我已经。。。文件放错了地方,但我要么找到它,要么很快再次运行实验,然后进行训练并发布更新。但我记得你得到了一个基本相似的模式


更新:无论是否在锁定代码中,在某些多处理器体系结构上可能发生的一种现象是,当多个处理器进行大量内存访问时,最终可能会导致内存总线溢出,实际上,处理器会相互减慢速度。(这有点像以太网——您向网络中添加的机器越多,它们发送数据时发生冲突的可能性就越大。)

这可能是一个非常常见的发现,这取决于您正在做什么,以及您正在使用什么来替代锁

本质上,发生的事情是,像ReentrantLock这样的构造内置了一些逻辑,当它们实际上无法获得锁时,它们知道“何时退出”。这减少了在重复尝试获取锁的逻辑中消耗的CPU量,如果使用更简单的锁结构,可能会发生这种情况

举个例子,看一看我匆匆贴出的图表。它显示了使用不同的构造作为锁定机制不断访问数组随机元素的线程的吞吐量。沿X轴是螺纹的数量;Y轴是吞吐量。蓝线是一个可重入锁;黄色、绿色和棕色线条使用旋转锁的变体。请注意,在线程数较少的情况下,自旋锁的吞吐量可能会比您预期的更高,但随着线程数的增加,ReentrantLock的后退逻辑开始发挥作用,它最终会做得更好,而在高争用情况下,自旋锁只会占用CPU

顺便说一下,这实际上是在双处理器机器上进行的试运行;我也在亚马逊云上运行过它(实际上是一个8路Xeon),但我已经。。。文件放错了地方,但我要么找到它,要么很快再次运行实验,然后进行训练并发布更新。但我记得你得到了一个基本相似的模式

更新:无论是否在锁定代码中,在某些多处理器体系结构上可能发生的一种现象是,当多个处理器进行大量内存访问时,最终可能会导致内存总线溢出,实际上,处理器会相互减慢速度。(这有点像以太网——越是