ReentrantReadWriteLock,ReadLock和WriteLock之间有什么区别

我所知道的,writelock就像是同步的。

Readlock和writelock以某种方式相互影响。

ReadLock似乎不能单独工作。

readLock.lock(); 

这意味着如果任何其他线程正在写入 (即保持写锁定),则在此处停止,直到没有其他线程正在写入。

一旦授予锁定,就不会允许其他线程写入 (即进行写锁定),直到锁定被释放。


 writeLock.lock(); 

这意味着如果任何其他线程正在读取写入 ,请在此处停止并等待,直到没有其他线程正在读取或写入。

一旦授予锁定,就不会允许其他线程读取写入 (即读取或写入锁定),直到锁定被释放。


结合这些,您可以一次只安排一个线程进行写访问,但是除了线程写入之外,您可以同时读取多个读取器。

换一种方式。 每次要从结构中读取时 ,请执行锁定。 每次要写入时 ,都要进行锁定。 这样一旦写入发生,没有人正在阅读(你可以想象你有独家访问权限),但只要没有人在写,就会有许多读者同时阅读。

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

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

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

当线程获取WriteLock ,除非该线程释放锁,否则任何其他线程都不能获取同一ReentrantReadWriteLock实例的ReadLockWriteLock 。 但是,多个线程可以同时获取ReadLock

使用ReadWriteLock,可以提高应用程序的性能,在该应用程序中,对共享对象执行的读取次数多于写入次数。

ReadWriteLock为读写操作维护两个锁。 只能同时获取一个读或写锁。 但是multithreading可以同时获取读锁定,前提是任何线程都不会获取写锁定。

ReentrantReadWriteLock是ReadWriteLock的一个实现。 如果多个线程没有等待读锁定,它会对最长的等待线程进行写锁定。 如果多个线程正在等待读锁定,则会向它们授予读锁定。

获取读锁的读卡器可以重新读取锁定,类似地,写入器可以重新获取写锁定并且也可以获取读锁定。

请参阅http://www.zoftino.com/java-concurrency-lock-and-condition-examples