6

请向我解释一下合同。我无法弄清楚是否包含在ReentrantReadWriteLock某种相关的两个锁?或者这些只是两个普通锁的捆绑?

4

2 回答 2

9

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

规则是:

  • 多个读者可以同时共享资源。如果你有一个读锁,你可以安全地获得另一个读锁。共享锁的最大计数为 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

于 2013-02-19T11:35:18.603 回答
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.

于 2012-10-26T17:59:02.550 回答