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

理解Java中的公平可重入锁

澹台蕴藉
2023-03-14

ReentrantLockAPI文档说明:

  1. 这个类的构造函数接受一个可选的公平性参数。当设置为true时,在争用状态下,锁倾向于授予对等待时间最长的线程的访问权限。
  2. 注意,锁的公平性并不能保证线程调度的公平性。因此,使用公平锁的许多线程中的一个可以连续多次获得它,而其他活动线程没有进展,并且当前没有持有锁。

我无法理解第2点:

如果一个线程连续多次获得锁,那么根据第1点,其他线程将等待更长时间,这确实意味着它们下次将获得锁。那么这如何不影响线程调度的(公平性)呢?因此,我觉得公平锁只不过是第一线程调度的最长等待时间。

共有1个答案

公孙黎昕
2023-03-14

我认为他们只是试图将公平逻辑与调度逻辑分开。线程可能是并发的,但这并不意味着它们试图同时访问Locks。线程优先级请求只是对操作系统的提示,并且永远不会以预期的方式得到保证。

所以,仅仅因为你有线程A和线程B,它们可能会请求一个锁,甚至可能有相同的行为,一个线程可能会在其他锁请求它之前执行、获取锁、释放、重新获取:

A:请求锁定-

线程调度逻辑与Lock逻辑解耦。

还有其他调度问题,其负担通常落在软件设计者身上,参见饥饿和Livelock

 类似资料:
  • 我试图理解java中的公平锁,并从中执行了一个实现 http://tutorials.jenkov.com/java-concurrency/starvation-and-fairness.html 哪个很好 代码如下所示 队列对象的代码 我了解其中的大部分,但我有两个疑问 1)在这一行代码中 这个零件是做什么用的? 它有什么作用?因为我删除了这部分代码,得到了相同的正确结果。 2) 因为我相信我

  • 我写了下面的测试代码在Java使用ReentantReadWriteLock来了解公平和不公平模式之间的区别。然而,我看到在两种模式下,结果和输出总是相同的。它似乎总是在公平模式下工作。谁能解释一下,在何种情况下,公平和不公平模式会导致不同的行为? 输出总是: 当我将锁创建更改为公平模式时,上面的输出是我期望看到的: 对于非公平模式,我希望看到以下输出:

  • 主要内容:1 ReentrantLock的概述,1.1 ReentrantLock的API方法,1.2 可重入,1.3 公平与非公平,2 ReentrantLock的原理,2.1 基本结构,2.2 构造器,2.3 非公平模式加锁原理,2.4 公平模式加锁原理,2.5 解锁原理,3 ReentrantLock总结Java的ReentrantLock的源码实现,包括加锁、解锁的源码,以及公平性、重入性的实现! 1 ReentrantLock的概述 public class ReentrantLock

  • 我在学习Java中的重入锁定。需要一定的澄清这个概念,它实际上是如何工作的。下面的片段我所理解的是:

  • 我学习Java已经一年了,这个问题让我很困惑。 目前我正在使用JavaSwing,我想知道为什么我必须写这行代码 当我想使用actionListener时,即使我之前已经导入了整个awt包:/ 为什么我必须告诉编译器导入一个子包(它的名称正确吗?),例如事件包,当我已经导入awt包下的所有内容时? 非常感谢!

  • 问题内容: ReentrantReadWriteLock具有公平和不公平(默认)模式,但是文档对我来说很难理解。 我怎么理解?如果有一些代码示例对其进行演示,那就太好了。 更新 如果我有一个写线程,而有许多读线程,哪种模式更好?如果我使用非公平模式,写线程是否有机会获得锁? 问题答案: 不公平 是指当准备好通过新线程获取锁时,该锁不能保证谁获得了该锁的公平性(假设当时有多个线程在请求​​该锁)。换