StampedLock队列锁定请求如何?

时间:2018-05-03 12:53:45

标签: java multithreading concurrency locking

我正在研究基于Java8的 StampedLock javadoc here)来锁定缓存,但我无法在网上找到令人信服的实现,尽管阅读了类似的文章StampedLock Idioms

我感到震惊的是,ReentrantReadWriteLock不允许将读锁升级到写锁,后来难以归结为信誉良好的Java多线程和并发产品。替代解决方案

我的问题是没有明确的声明来消除我担心StampedLock会在读取请求排队时无限期地阻止写请求。

查看文档,有2条评论引起了我的怀疑。

来自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之后插入一个实现,但最后我还是留在网上,想知道为什么没有一个循环{{1}的例子。 } - 即使code from the benchmark article也不这样做。

Java兼并这么困难还是我错过了一些明显的东西?

1 个答案:

答案 0 :(得分:0)

  

" Java并发性如此困难还是我错过了一些明显的东西?"

这是一个意见问题 1 Java并发是否比(比如说)C ++或Python并发更难。

但是,在任何允许不同线程直接更新共享数据结构的语言中,并发性很难 2 。 (仅)支持类似CSP的并发的语言更容易理解和推理。

参考:

对于您的具体观点,Java中的大多数锁定形式都不能保证公平性。事实上,许多与线程调度有关的事情(故意)松散地指定。但是编写避免这些问题的代码并不难......一旦你理解了库以及如何使用它们。

1 - 我的观点是Java的并发支持至少比其他大多数语言更易于推理。 Java内存模型(JLS的第17.4章)已经明确规定,并且" Java Concurrency In Practice" Goetz等人很好地解释了并发编程的细节。

2 - ....对于大多数程序员来说。