我正在研究基于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兼并这么困难还是我错过了一些明显的东西?
答案 0 :(得分:0)
" Java并发性如此困难还是我错过了一些明显的东西?"
这是一个意见问题 1 Java并发是否比(比如说)C ++或Python并发更难。
但是,在任何允许不同线程直接更新共享数据结构的语言中,并发性很难 2 。 (仅)支持类似CSP的并发的语言更容易理解和推理。
参考:
对于您的具体观点,Java中的大多数锁定形式都不能保证公平性。事实上,许多与线程调度有关的事情(故意)松散地指定。但是编写避免这些问题的代码并不难......一旦你理解了库以及如何使用它们。
1 - 我的观点是Java的并发支持至少比其他大多数语言更易于推理。 Java内存模型(JLS的第17.4章)已经明确规定,并且" Java Concurrency In Practice" Goetz等人很好地解释了并发编程的细节。
2 - ....对于大多数程序员来说。