我所知道的,writelock就像是同步的。
Readlock和writelock以某种方式相互影响。
ReadLock似乎不能单独工作。
答案 0 :(得分:89)
这意味着如果任何其他线程写入(即持有写锁定),则在此处停止,直到没有其他线程正在写入。
一旦授予锁定,就不允许其他线程写入(即进行写锁定)直到锁定被释放。
这意味着如果任何其他线程正在阅读或写,请在此处停止并等待其他线程无法读取或写入。
一旦授予锁定,将不允许其他线程读取或写入(即进行读取或写入锁定),直到锁定被释放。
通过组合这些,您可以一次只安排一个线程进行写访问,但是除了线程正在写入之外,您可以同时读取多个读取器。
换句话说。每当您想要从结构读取时,请执行读取锁定。每次要写时,请执行写入锁定。这样一旦写入发生,没有人正在阅读(你可以想象你有独家访问权限),但只要没有人正在写作,就会有许多读者同时阅读。
答案 1 :(得分:17)
ReadWriteLock
的文档清楚地说明了这一点:
ReadWriteLock维护一对关联的锁,一个用于只读操作,另一个用于写入。只要没有写入器,读锁定可以由多个读取器线程同时保持。写锁是独占的。
所以你一次可以有很多读者,但只有一位作家 - 作家也会阻止读者阅读。如果您有一些可以安全地从多个线程读取的资源,并且读取比写入更常见,但是当资源不是实际上只读时,这非常有用。 (如果没有作家并且阅读是安全的,则根本不需要锁定。)
答案 2 :(得分:6)
当线程获得WriteLock
时,除了该线程释放锁之外,没有其他线程可以获取同一ReadLock
实例的WriteLock
和ReentrantReadWriteLock
。但是,多个线程可以同时获取ReadLock
。
答案 3 :(得分:0)
使用ReadWriteLock,可以提高应用程序的性能,在该应用程序中,对共享对象执行的读取次数多于写入次数。
ReadWriteLock为读写操作维护两个锁。只能同时获取一个读或写锁。但是,如果任何线程都没有获取写锁定,则多个线程可以同时获取读锁定。
ReentrantReadWriteLock是ReadWriteLock的一个实现。如果多个线程没有等待读锁定,它会对最长的等待线程进行写锁定。如果多个线程正在等待读锁定,则会向它们授予读锁定。
获取读锁的读卡器可以重新读取锁定,同样,写入器可以重新获取写锁定并且也可以获取读锁定。
请参阅http://www.zoftino.com/java-concurrency-lock-and-condition-examples
答案 4 :(得分:0)
考虑一种情况:在数据结构为read-mostly
的情况下-它们是可变的,有时会被修改,但是大多数访问主要涉及读取,因此在这种情况下,我们可以放宽锁定机制,以便允许多个读取器访问数据结构,而不是在一个读取器释放锁定时等待读取器。只要保证每个线程都能共享数据的最新视图,并且在读者查看共享线程时没有线程修改它,就不会有问题。这就是读写所允许的:一个资源一次可以被多个读取器或单个写入器访问,但不能同时访问两者。