当前位置: 首页 > 知识库问答 >
问题:

如果同一个线程一次又一次地获取锁,ReentrantLock如何公平?

羊舌源
2023-03-14

我对高级Java和可重入锁的学习相当陌生。我知道ReentrantLock有一个公平性参数,它确保将锁提供给最缺线程(与同步的内部锁不同)

但是,Reentrant也意味着同一线程可以通过递增holdcount来一次又一次地重新获取锁。如果同一个线程一直获得锁,它如何保证公平性?

共有1个答案

缪远
2023-03-14

如果线程重新进入锁,这意味着它从未解锁过,以便给其他线程留下公平的机会。公平性取决于当锁没有被持有时选择下一个线程。

 类似资料:
  • 您好,我想平稳地更新seekbar,每秒钟更新一次,所以我创建了一个使用计时器的方法,每秒钟更新seekbar,但它每秒钟都在更新歌曲,我到处搜索,但没有找到解决方案,我不想使用任何处理程序,我想用这个方法修复 在这里我实现了歌曲开始时的方法 这是我的全部代码

  • 我有一个Spring输入通道,定义如下 文件名示例为test.sqq。SQQ是客户端用于将文件放在FTP中的文件格式。但是,我看到spring ftp适配器一次又一次地使用不同的文件名获取相同的文件。所以第一次是test.sqq。然后下一次是test.sqq-20170204.pqq,然后下一次是test.sqq-20170204.pqq.20170304.pqq。这种情况还在继续。我在我的一端有

  • 问题内容: 我想使用其中包含图像。 我不想使用,因为我想将此主体直接写入文件并希望对其进行解码,所以我只想使用对内容的引用来传递给进一步的函数调用, 我尝试创建读取器的多个实例,如下所示 但是在第二次通话中它总是导致。 请帮助我如何为同一读者传递多个单独的参考? 问题答案: 被视为流。因此,您无法阅读两次。想象一下传入的TCP连接。您无法倒带进来的内容。 但是您可以使用复制流: Go Playgr

  • 问题内容: 我有以下结构: 该方法 可以 被许多线程同时调用。该 会 抛出异常(它在后台,可能成为过时的使用一些数据)。 如果引发异常,则执行一些耗时的任务,比如说“更新”所有当前数据,并且我可以调用。 问题: 如何确保只调用 一次 ?如果我在的条目中放置了原子标志,则不能确定何时清除该标志。 我该如何解决?请注意:由于它是一个外部API,因此我无法修改,并且我正在使用装饰器模式来使用它。 问题答

  • 这是取自约书亚·布洛赫(Joshua Bloch)写的一本书。 我的母语不是英语,因此有理由要求澄清疑问。 因为内部锁是可重入的,所以如果线程试图获取它已经持有的锁,那么请求就会成功。重传意味着锁是按线程获取的,而不是按调用**获取的。 根据每次调用,他是指每次方法调用吗?考虑片段: 假设有一个,并且能够获取具有实例方法 时,锁被认为是未锁定的。当一个线程获得一个先前未被锁定的锁时,JVM会记录拥