有关读写锁的查询

时间:2013-08-12 07:58:30

标签: java multithreading java.util.concurrent

我正在研究java并发API并尝试理解读写锁的有用性。 javadoc表示readwrite块维护一对锁,一个用于读取,另一个用于写操作。虽然写锁是线程的独占访问,但多个线程可以获取读锁。因此,如果在读取部分中我们所做的只是读取操作,并且我们无论如何都提供多线程访问,那么首先需要读取锁定是什么?是否存在读写锁实际有用的情况?

3 个答案:

答案 0 :(得分:3)

如果您正在阅读许多线程中的数据,由于可见性问题,您可能无法看到数据的最新更改。有许多层可以在每个线程的基础上缓存数据:不同的CPU缓存层,RAM访问缓冲区等等。在你可能确定的情况下,Havling读锁定,你总是在观察最新的状态。

写锁更强大,提供访问的原子性以及最新更改的可见性。

这里有不同类型锁的主要原因是能够获得足够的同步水平,而不会为其他线程引入太多开销和锁。

  

是否存在读写锁实际有用的情况?

当你有一些内存数据(数组,集合或其他)时非常有用,这些数据被不同的线程大量查询,但这些数据的更新很少发生。在这种情况下,具有单独的锁(用于查询的读锁和用于更新的写锁)可以为您提供显着的性能优势。

答案 1 :(得分:3)

  

....首先需要使用readlock

在阅读时,你需要阻止作家获得锁...直到所有读者都完成。但是另一个读者可以获得锁定。

写作时,您需要阻止读者获取锁定......直到作者完成。

(换句话说,可以有一个作家,或者多个读者持有锁......但不是两个。)

为了描述这一点,将行为描述为两个锁是有帮助的。 实际上在幕后发生的......是特定于实现的。


  

是否存在读写锁实际有用的情况?

好吧,是的。在任何可以区分需要共享只读访问的线程和需要独占读写(或只写)的线程的情况下,ReadWrite锁允许比简单Lock更多并发或一个原始的互斥体。

答案 2 :(得分:1)

拥有只读锁的原因是,如果某个其他线程的对象被锁定以进行写入,则该对象的状态可能不一致,因此您根本不想开始读取它而没有锁定。获取读锁定可确保(1)对象在查看时处于一致状态,因为没有其他线程正在修改它,并且(2)没有其他线程可以启动修改它直到您通过观察它。我们将读锁定作为一个单独的类型,因为如果通常需要读取大量线程但没有更新,那么读者可以同时查看。