繁体   English   中英

有关读写锁的查询

[英]Query regarding read-write locks

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

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

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

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

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

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

....首先需要使用readlock是什么

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

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

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

出于描述的目的,将行为描述为两个锁是有帮助的。 实际发生的事情......是特定于实现的。


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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM