【问题标题】:Performance of ReentrantReadWriteLock read lock?ReentrantReadWriteLock 读锁的性能?
【发布时间】:2014-09-28 17:44:35
【问题描述】:

我有一些类似于地图的存储空间。我一直在将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.

【问题讨论】:

  • 你用什么jdk?
  • java版本“1.7.0_67”
  • 虽然你的数据只是一个地图,你考虑过ConcurrentHashMap吗?至少为了比较。
  • @JoopEggen 的性能与我的实现相同。

标签: java multithreading performance synchronization jmh


【解决方案1】:

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

ReentrantReadWriteLocks 可用于在某些情况下提高并发性 使用某些类型的集合。这通常只值得 当集合预计很大时,由更多读者访问 线程而不是编写器线程,并且需要具有开销的操作 超过同步开销。

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

【讨论】:

  • 谢谢。我犯了一个错误,我的测试使用 2 个活动线程运行。顺便说一句,这是interesting article
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-16
相关资源
最近更新 更多