为何JDK21中获取已锁定ReentrantLock的性能低于JDK11?
关于ReentrantLock重入场景JDK11与JDK21性能差异的分析与优化疑问
测试背景与发现
在优化锁相关代码时,通过JMH基准测试对比ReentrantLock单次锁定与重入锁定的性能开销,意外发现JDK11在重入场景下的表现优于JDK21。同时补充的synchronized块及无锁场景测试结果符合预期:synchronized经JVM优化后性能几乎与无锁场景持平,且不同JDK版本间无性能衰减。
基准测试代码
@Warmup(iterations = 5, time = 1, timeUnit = TimeUnit.SECONDS) @Measurement(iterations = 10, time = 1, timeUnit = TimeUnit.SECONDS) @Fork(1) @State(Scope.Benchmark) @BenchmarkMode(Mode.AverageTime) @OutputTimeUnit(TimeUnit.NANOSECONDS) public class LockNoLockBenchmark { int counter; ReentrantLock lock = new ReentrantLock(); @Benchmark public void noLock() { ++counter; } @Benchmark public void syncLock() { synchronized (new Object()) { ++counter; } } @Benchmark public void lockUnlock() { lock.lock(); try { ++counter; } finally { lock.unlock(); } } @Benchmark public void lockLockUnlockUnlock() { lock.lock(); try { lock.lock(); try { ++counter; } finally { lock.unlock(); } } finally { lock.unlock(); } } }
测试环境
- 处理器:Intel Rocket Lake 12代Intel(R) Core(TM) i9-12950HX(12核)
- 内存:64GB
测试结果
JDK 21测试结果
openjdk 21.0.2 2024-01-16 OpenJDK Runtime Environment (build 21.0.2+13-58) OpenJDK 64-Bit Server VM (build 21.0.2+13-58, mixed mode, sharing) Benchmark Mode Cnt Score Error Units LockNoLockBenchmark.lockLockUnlockUnlock avgt 10 27.457 ± 0.876 ns/op LockNoLockBenchmark.lockUnlock avgt 10 11.409 ± 0.256 ns/op LockNoLockBenchmark.noLock avgt 10 0.280 ± 0.010 ns/op LockNoLockBenchmark.syncLock avgt 10 0.280 ± 0.008 ns/op
JDK 11测试结果
openjdk 11.0.21 2023-10-17 OpenJDK Runtime Environment (build 11.0.21+9-post-Ubuntu-0ubuntu122.04) OpenJDK 64-Bit Server VM (build 11.0.21+9-post-Ubuntu-0ubuntu122.04, mixed mode, sharing) Benchmark Mode Cnt Score Error Units LockNoLockBenchmark.lockLockUnlockUnlock avgt 10 22.414 ± 1.366 ns/op LockNoLockBenchmark.lockUnlock avgt 10 11.690 ± 0.407 ns/op LockNoLockBenchmark.noLock avgt 10 0.283 ± 0.021 ns/op LockNoLockBenchmark.syncLock avgt 10 0.289 ± 0.012 ns/op
核心疑问与优化需求
- 原本预期JDK21在该场景下不会出现性能衰减,想了解ReentrantLock重入场景JDK21性能低于JDK11的原因,同时确认本次基准测试是否准确。
- 希望获取针对**需要获取已锁定锁(重入)**场景的代码优化方法。
内容的提问来源于stack exchange,提问作者alexid
相关产品推荐
相关产品推荐

