【问题标题】:ReadWriteLock vs StampedLockReadWriteLock 与 StampedLock
【发布时间】:2015-05-09 04:37:08
【问题描述】:

我一直在使用ReadWriteLock`s 来实现/维护锁定习语。

自从 JDK8 StampedLock 被引入。并且由于 RWLocks 以其缓慢和糟糕的性能而闻名,StampedLock 看起来像是一种替代方案(它们不是可重入的,因此速度要快得多)。

但是,除了性能之外,在我看来,StampedLock 的维护和使用更加困难和复杂 - 例如。线程现在可以自己死锁 - 所以应该采取相应的行动。

StampedLock 相对于 RWLock 有什么好处?

【问题讨论】:

  • 我总是觉得有趣的是人们愿意花 5 分钟来写下一个问题……只需要 5 到 10 秒就可以找到非常有用的“A vs B”答案使用自己喜欢的搜索引擎的主题。
  • 您从哪里得知 RWLocks 以性能不佳着称的信息?
  • StampedLock 是对 RWLock 的重大改进。例如:mechanical-sympathy.blogspot.ru/2013/08/…

标签: java multithreading java-8 java.util.concurrent


【解决方案1】:

这个article 详细解释了差异。

ReentrantReadWriteLock 有很多缺点:它遭受饥饿。您无法将读锁升级为写锁。不支持乐观阅读。 “知情”的程序员大多避免使用它们。

Doug Lea 的新 Java 8 StampedLock 解决了所有这些缺点。通过一些巧妙的代码习惯,我们也可以获得更好的性能。

【讨论】:

  • 注意:StampedLock 更难使用,具体取决于您在锁定时要执行的操作。
【解决方案2】:

嗯,是的,ReentrantReadWriteLock 在 5.0 中存在问题(与传统的同步块相比),但他们在 java 6.0 中修复了它。

所以,如果你们在生产环境中使用 Java 6,则可以放心使用 lock API。

性能明智的锁和传统同步给你同样的。

lock API 的好处是它使用 CAS/非阻塞,因此它永远不会以死锁告终,除非你忘记在 finally 块中解锁它。

【讨论】:

猜你喜欢
  • 2016-04-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-10
  • 2016-01-25
相关资源
最近更新 更多