ReentrantReadWriteLock

ReentrantReadWriteLock

我有一些类似于 map 的存储空间。我一直在将synchronized(this)用于getput方法。由于此存储主要用于读取,因此我想到了使用ReentrantReadWriteLock以获得更好的性能-仅锁定put

我希望在查询上有更好的性能(因为存储内容未更改)。但是,我的JMH测试显示了相反的结果:

.benchmarkClassMap3ClassLookup    thrpt       20    460.152        7.417  ops/ms
.benchmarkClassMapClassLookup     thrpt       20   1196.085       23.635  ops/ms

第一行是使用ReentrantReadWriteLock的代码。第二行是原始代码,使用synchronized。编辑:测试正在与2个线程一起运行。

是否还有其他人对ReentrantReadWriteLock进行了基准测试?结果不应该不同吗?还是仅在多线程环境中显示阳性结果?

相关:this

最佳答案

您肯定需要多个线程才能看到好处,因为ReentrantReadWriteLock比简单的synchronized更复杂。在synchronized的情况下,如果JVM看到只有一个线程,则可能会一起优化和删除同步。但是,这也是ReentrantReadWriteLock javadoc的引文:



如果您愿意使用Java 8,则可以用此发行版附带的新StampedLock替换ReentrantReadWriteLock。有关简短示例和好处,请参见this answer

10-08 09:05