ReentrantReadWriteLock:ReadLock和WriteLock有什么区别?readLock.lock();writeLock.lock();

我所知道的是:

  • ReadLockWriteLock 以某种方式相互影响
  • WriteLock就像同步一
  • ReadLock似乎不能单独工作

答案 1

readLock.lock();

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

writeLock.lock();

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

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

换句话说。每次要从结构中读取时,请进行读取锁定。每次你想,拿一个锁。这样,每当写作发生时,没有人在阅读(你可以想象你有独家访问权限),但只要没有人在写作,就可能有很多读者同时阅读。


答案 2

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

读写锁维护一对关联的锁,一个用于只读操作,一个用于写入。读锁定可以由多个读取器线程同时持有,只要没有写入器即可。写锁定是独占的。

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