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

时间:2012-10-26 17:55:57

标签: java java.util.concurrent reentrantreadwritelock

请向我解释更多合同。我无法弄清楚ReentrantReadWriteLock中包含的两个锁是否有某种关联?或者这些只是一组两个正常的锁?

2 个答案:

答案 0 :(得分:6)

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

规则是:

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

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

假设当前的锁定状态是      c = xxxx xxxx xxxx xxxx yyyy yyyy yyyy yyyy then 读卡器锁的数量是高位xxxx xxxx xxxx xxxx

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

答案 1 :(得分:2)

如果线程正在等待Read Lock它是共享的,但是当线程想要获取写锁时,只允许该线程获得与互斥相同的访问权。

因此允许任何一项操作。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