【发布时间】:2018-10-13 19:13:44
【问题描述】:
我正在研究基于 Java8 的 StampedLock (javadoc here) 锁定缓存,但尽管阅读了 StampedLock Idioms 之类的文章,但我在网上找不到令人信服的实现。
在对ReentrantReadWriteLock 不允许将读锁升级为写锁感到震惊之后,我对 Java 的多线程和并发产品感觉不太乐观,随后又难以找到一个有信誉的替代解决方案.
我的问题是,没有明确的声明可以减轻我对StampedLock 会在有读取请求排队时无限期阻止写入请求的担忧。
查看文档,有 2 个 cmets 引起了我的怀疑。
来自Javadoc:
StampedLock 的调度策略并不一致 读者超过作者,反之亦然。所有的“尝试”方法都是尽力而为 并且不一定符合任何调度或公平政策。
来自source code:
* These rules apply to threads actually queued. All tryLock forms
* opportunistically try to acquire locks regardless of preference
* rules, and so may "barge" their way in. Randomized spinning is
* used in the acquire methods to reduce (increasingly expensive)
* context switching while also ....
所以它暗示了一个读写锁队列,但我需要阅读和消化整个 1500 行源代码才能确定它。
我认为它一定存在,因为我找到了 good benchmarking article,它表明 StampedLock 是进行多次读取/少量写入的方式。但是,由于缺乏在线报道,我仍然很担心。
从根本上说,我想我希望有一个实现,我可以在 javadoc 之后即插即用,但最后我还是在网上扎根,想知道为什么在任何地方都没有循环 StampedLock#tryOptimisticRead() 的示例 -即使code from the benchmark article 也不这样做。
Java 并发这么难还是我遗漏了一些明显的东西?
【问题讨论】:
标签: java multithreading concurrency locking