我有一些类似于 map 的存储空间。我一直在将synchronized(this)
用于get
和put
方法。由于此存储主要用于读取,因此我想到了使用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。