Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/387.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 可重入式写锁:什么';读锁和写锁的区别是什么?_Java_Multithreading_Locking_Deadlock_Reentrantreadwritelock - Fatal编程技术网

Java 可重入式写锁:什么';读锁和写锁的区别是什么?

Java 可重入式写锁:什么';读锁和写锁的区别是什么?,java,multithreading,locking,deadlock,reentrantreadwritelock,Java,Multithreading,Locking,Deadlock,Reentrantreadwritelock,我知道的是: 互相影响 WriteLock与synchronized类似 ReadLock似乎无法单独工作 的文档清楚地说明了这一点: ReadWriteLock维护一对关联锁,一个用于只读操作,一个用于写入。只要没有写入程序,读锁可以由多个读线程同时保持。写锁是独占的 因此,一次可以有多个读者,但只有一个作者,而作者也会阻止读者阅读。如果您有一些资源可以安全地从多个线程读取,并且读取比写入更常见,但资源实际上不是只读的,那么这非常有用。(如果没有写入程序且读取是安全的,则根本不需要锁。)当线

我知道的是:

  • 互相影响
  • WriteLock
    与synchronized类似
  • ReadLock
    似乎无法单独工作
的文档清楚地说明了这一点:

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


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

当线程获取
写锁时,除非该线程释放锁,否则其他线程无法获取
读锁
写锁
。但是,多个线程可以同时获取
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才会等待。