ReentrantReadWriteLock中的读写锁是否有某种关联?

Dim*_*ims 5 java reentrantreadwritelock java.util.concurrent

请多解释一下合同.我无法弄清楚两个锁是否以ReentrantReadWriteLock某种方式包含在内?或者这些只是一捆两个正常的锁?

Sat*_*ish 8

它允许多个线程同时读取资源,但需要线程等待独占锁才能写入资源.

规则是:

  • 几个读者可以同时共享资源.如果您有读锁定,则可以安全地获取另一个读锁定.共享锁的最大数量为1111 1111 1111 1111
  • 如果您有读锁定,则无法获得写锁定
  • 如果您有写锁定,则无法在任何其他线程中获取读锁定.
  • 当任何其他线程中没有活动的作者时,读者可以访问该资源.
  • 如果您有写锁定,则可以在同一个线程中获取另一个写锁定.线程可以拥有的最大独占锁数是1111 1111 1111 1111
  • 当没有其他读者或编写者(来自不同的线程)处于活动状态时,编写者可以访问该资源.
  • 喜欢作家超过读者.也就是说,如果编写器正在等待锁定,则不允许来自其他线程的新读者访问该资源.现有读者可以继续使用该资源,直到他们释放锁定.这可以防止所谓的"作家饥饿".
  • 允许从写锁定降级到读锁定,通过获取写锁定,然后读取锁定然后释放写锁定.但是,无法从读锁定升级到写锁定.

在内部,锁定状态(c)由int值维护.在这种情况下,由于我们有读写锁,因此它在逻辑上分为两个短路:较低的一个表示独占(写入)锁定保持计数,而较高的一个表示共享(读取器)保持计数.

假设当前的锁定状态是c = xxxx xxxx xxxx xxxx yyyy yyyy yyyy yyyy那么读取器锁定数是高位xxxx xxxx xxxx xxxx

作家锁的数量是低位yyyy yyyy yyyy yyyy


Ami*_*nde 2

如果线程正在等待读锁,则它是共享的,但当线程想要获取写锁时,仅允许该线程进行与互斥相同的访问。

因此任一操作都是允许的。if lock is held by readers and thread request write lock no more readers are allowed to acquire read lock until thread which has acquired write lock release it

  • `ReentrantReadWriteLock` 的设计是为了让你_不能_在有人读取时获取写锁,反之亦然。这是重点的一部分。 (2认同)