ReentrantReadWriteLock:ReadLock 和 WriteLock 有什么区别?

IT小君   2021-10-24T06:15:35

我所知道的是:

  • ReadLockWriteLock以某种方式相互影响
  • WriteLock就像同步
  • ReadLock 似乎不能单独工作
评论(5)
IT小君

读锁.lock();

  • 这意味着如果任何其他线程正在写入(即持有写锁),则在此处停止,直到没有其他线程正在写入。
  • 一旦锁定被授予 ,在锁定被释放之前将不允许其他线程写入(即获取写入锁定)。

writeLock.lock();

  • 这意味着如果任何其他线程正在读取写入,请在此处停止并等待直到没有其他线程正在读取或写入。
  • 一旦锁定被授予,在锁定被释放之前,将不允许其他线程读取 写入(即获取读取或写入锁定)。

将这些结合起来,您可以一次只安排一个线程具有写访问权限,但是除了线程正在写入之外,您可以同时读取任意数量的读者。

换一种方式。你想每次读取从结构,采取了锁。每次你想写,拿一个锁。这样,每当写入发生时,没有人正在阅读(您可以想象您拥有独占访问权限),但是只要没有人在写作,就可以有许多读者同时阅读。

2021-10-24T06:15:35   回复
IT小君

的文档ReadWriteLock清楚地说明了这一点:

ReadWriteLock 维护一对关联的锁,一个用于只读操作,一个用于写入。只要没有写者,读锁就可以被多个读者线程同时持有。写锁是独占的。

所以你可以一次有很多读者,但只有一个作者——作者也会阻止读者阅读。如果您有一些资源可以安全地从多个线程读取,并且读取比写入更常见,但是当资源实际上不是只读时,这很有用。(如果没有作者并且阅读是安全的,则根本不需要锁定。)

2021-10-24T06:15:35   回复
IT小君

当一个线程获取WriteLock,没有其他线程可以获取ReadLock,也没有WriteLock相同的实例中ReentrantReadWriteLock,除非该线程释放锁。但是,多个线程可以同时获取ReadLock

2021-10-24T06:15:35   回复
IT小君

使用 ReadWriteLock,您可以提高对共享对象执行的读取多于写入的应用程序的性能。

ReadWriteLock 为读写操作维护两个锁。只能同时获取一个读锁或写锁。但是多个线程可以同时获取读锁,前提是任何线程都没有获取写锁。

ReentrantReadWriteLock 是 ReadWriteLock 的一个实现。如果多个线程没有等待读锁,它会为最长的等待线程提供写锁。如果多个线程正在等待读锁,则授予他们读锁。

获得读锁的读者可以重新获得读锁,同样,写者可以重新获得写锁,也可以获得读锁。

请参阅http://www.zoftino.com/java-concurrency-lock-and-condition-examples

2021-10-24T06:15:36   回复
IT小君

考虑一种情况:在数据结构是read-mostly- 它们是可变的并且有时会被修改的情况下,但大多数访问主要涉及读取,因此在这种情况下,我们可以放松锁定机制,以便允许多个读取器访问数据结构而不是读者在一个读者释放锁时等待。只要保证每个线程都有共享数据的最新视图,并且在读者查看时没有线程修改它,就不会有问题。这就是读写所允许的:一个资源可以被多个读者或一个作者一次访问,但不能同时被多个读者访问。

2021-10-24T06:15:36   回复