与Java中多线程环境中的 synchronized 关键字相比,我们何时应该使用 ReentrantReadWriteLock ?
在Java中使用 ReentrantReadWriteLock 而不是 synchronized 有什么好处?
任何人都可以给出一个例子(用Java)吗?
谢谢!
答案 0 :(得分:22)
同步允许一次一个线程。
读/写锁允许同时在多个读取器中,但只有在没有编写器的情况下才允许。因此,在某些使用场景下,我们可以获得更好的并发性,因为读者群可以一起进行。
Java API documentation给出了集合类的示例,这些集合类预计会有比读者更多的读者。
答案 1 :(得分:15)
locking article by Brian详细解释了每种方法的优缺点。
Lock框架是兼容的 替换同步,哪个 提供许多未提供的功能 同步,以及 实现更好 竞争中的表现。然而, 这些显而易见的存在 好处不是一个足够好的理由 总是喜欢ReentrantLock 同步。相反,做出来 根据你是否做出决定 需要ReentrantLock的力量。在 绝大多数情况下,你会的 不 - 同步只是工作 很好,适用于所有JVM,是理解的 由更广泛的开发人员组成,并且是 不容易出错。保存锁定的时间 你真的需要它。在那些情况下, 你会很高兴你拥有它。
答案 2 :(得分:0)
应该注意的是StampedLock
已经推出了Java 8,并且它比ReentrantReadWriteLock
快得多(特别是当你使用越来越多的线程时)你不使用锁一种可重入的方式(重复使用StampedLock
会导致死锁,所以不要这样做。)
如果没有有效的写锁定,它还允许可用的乐观读取非锁定。与普通读锁不同,它们不会阻止建立写锁。您可以使用the validate
method检查是否已在乐观读取非锁定上建立了写锁定。
它的界面有点不同,因为您必须存储一个名为戳记的long
值,以便以后正确解锁读取或写入锁定,或者以后validate
正确解读非锁定'完了。