ReentrantReadWriteLock vs synchronized

时间:2011-07-09 20:04:48

标签: java multithreading

与Java中多线程环境中的 synchronized 关键字相比,我们何时应该使用 ReentrantReadWriteLock

在Java中使用 ReentrantReadWriteLock 而不是 synchronized 有什么好处?

任何人都可以给出一个例子(用Java)吗?

谢谢!

3 个答案:

答案 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正确解读非锁定'完了。