我有一些类似地图的存储器。我一直在使用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的原始代码。编辑:测试用两个线程运行。
还有其他人以ReentrantReadWriteLock为基准吗?结果不应该不同吗?还是只有在多线程环境中才会出现积极的结果?
相关:这.
发布于 2014-09-28 18:07:03
您需要一定的多线程才能看到好处,因为ReentrantReadWriteLock比简单的synchronized要复杂得多。在synchronized的情况下,如果它看到只有一个线程,它可能会一起优化和删除同步。但是这里还有一个来自ReentrantReadWriteLock javadoc的引用:
ReentrantReadWriteLocks可用于提高某些集合的某些用途的并发性。这通常是值得的,只有当集合预计很大时,被更多的读取器线程访问,而不是写入线程,并且需要比同步开销更重的操作。
如果您愿意迁移到Java8,那么您可以用这个版本附带的新的ReentrantReadWriteLock来代替StampedLock。有关一个简短的示例和好处,请参见这个答案。
https://stackoverflow.com/questions/26087738
复制相似问题