Java 可重入式写锁:什么';读锁和写锁的区别是什么?
我知道的是:Java 可重入式写锁:什么';读锁和写锁的区别是什么?,java,multithreading,locking,deadlock,reentrantreadwritelock,Java,Multithreading,Locking,Deadlock,Reentrantreadwritelock,我知道的是: 互相影响 WriteLock与synchronized类似 ReadLock似乎无法单独工作 的文档清楚地说明了这一点: ReadWriteLock维护一对关联锁,一个用于只读操作,一个用于写入。只要没有写入程序,读锁可以由多个读线程同时保持。写锁是独占的 因此,一次可以有多个读者,但只有一个作者,而作者也会阻止读者阅读。如果您有一些资源可以安全地从多个线程读取,并且读取比写入更常见,但资源实际上不是只读的,那么这非常有用。(如果没有写入程序且读取是安全的,则根本不需要锁。)当线
- 互相影响
与synchronized类似WriteLock
似乎无法单独工作ReadLock
因此,一次可以有多个读者,但只有一个作者,而作者也会阻止读者阅读。如果您有一些资源可以安全地从多个线程读取,并且读取比写入更常见,但资源实际上不是只读的,那么这非常有用。(如果没有写入程序且读取是安全的,则根本不需要锁。)当线程获取
写锁时,除非该线程释放锁,否则其他线程无法获取读锁
或写锁
。但是,多个线程可以同时获取ReadLock
。ReadLock.lock();
- 这意味着如果任何其他线程正在写入(即持有
写锁)然后停止在这里,直到没有其他线程正在写
- 一旦授予锁,将不允许任何其他线程写入
(即,获取写锁)直到锁被释放
writeLock.lock();
- 这意味着如果任何其他线程正在读取或写入,请停止
在这里等待,直到没有其他线程正在读或写
- 一旦授予了锁,就不允许任何其他线程读取
或写入(即获取读或写锁),直到释放锁
结合这些功能,您一次只能安排一个线程具有写访问权限,但除了线程正在写入外,您可以同时读取任意多个读卡器
换句话说。每次您想从结构中读取,请执行读取锁定。每次要写入时,请锁定写入。这样,每当发生写入时,没有人在读取(您可以想象您拥有独占访问权限),但只要没有人在写入,就可以有多个读卡器同时读取。使用ReadWriteLock,您可以提高应用程序的性能,在该应用程序中,对共享对象执行的读取比写入多
ReadWriteLock为读写操作维护两个锁。同时只能获取一个读或写锁。但多个线程可以同时获取读锁,前提是任何线程都不能获取写锁
ReentrantReadWriteLock是ReadWriteLock的一个实现。如果多个线程没有等待读锁,它会给等待时间最长的线程提供写锁。如果多个线程正在等待读锁,则会将读锁授予它们
获得读锁的读卡器可以重新获得读锁,同样,写卡器可以重新获得写锁,也可以获得读锁
请参见考虑一种情况:在数据结构主要为
读取的情况下,它们是可变的,有时会被修改,但大多数访问主要涉及读取,因此,在这种情况下,我们可以放松锁定机制,允许多个读卡器访问数据结构,而不是读卡器在一个读卡器释放锁时等待。只要每个线程都能保证共享数据的最新视图,并且在读者查看数据时没有线程对其进行修改,就不会有问题。这就是读写所允许的:一个资源可以同时被多个读卡器或一个写卡器访问,但不能同时被两个读卡器访问。+1很好的解释。为了澄清一下,您所说的one
是指thread
。如果有100个读卡器,并且在这100个读卡器之间有1个写卡器想要获得锁,那么在这种情况下读卡器将被中断,该怎么办?或者编写器必须等待当前读卡器释放锁。@Vipin:编写器必须等待。现在您的答案是完美的:)例如,读卡器A正在阅读。然后编写器B来了,因此编写器B将等待。当B在等待时,读卡器C来了。所以读卡器C将等待B运行并完成,或者读卡器C可以尽快读取。谢谢。@hqt读取器C将开始读取,B将等待它完成。只有在B已经开始写入时,C才会等待。