3

我有一些类似于地图的存储空间。我一直在使用synchronized(this)forgetput方法。由于此存储主要用于读取,因此我考虑使用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?结果不应该不一样吗?还是只有在多线程环境中才会出现阳性结果?

相关:这个

4

1 回答 1

4

您肯定需要多个线程才能看到好处,因为ReentrantReadWriteLock比简单的synchronized. 如果synchronizedJVM 看到只有一个线程,它可能会一起优化和删除同步。但这里也引用了 ReentrantReadWriteLock javadoc:

ReentrantReadWriteLocks 可用于在某些集合的某些用途中提高并发性。这通常只有在预计集合很大、由比写入线程更多的读取线程访问并且需要开销超过同步开销的操作时才值得。

如果您负担得起迁移到 Java 8,则可以使用此版本附带ReentrantReadWriteLock的新StampedLock替换。有关简短示例和好处,请参阅此答案

于 2014-09-28T18:07:03.793 回答