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

ReeanTrandWriteLock中的公平锁定

孔棋
2023-03-14

在B. Goetz的Java实践中的并发,第13.5节说:

在Java5.0中,读锁的行为更像是一个信号量而不是锁,只维护活动读卡器的数量,而不是它们的身份。Java 6中的行为已更改,以跟踪哪些线程已被授予读锁6。

6这种变化的一个原因是,在java 5.0下,锁实现不能区分第一次请求读锁的线程和重入锁请求,这将使公平读写锁容易死锁。

我的问题是公平有什么问题?为什么不公平的读写锁会被死锁屏蔽?

你能解释一下他的意思吗?我的意思是,在哪些情况下,Java5下的公平读写锁会导致死锁?如果它表现得像一个Semaphore,为什么公平的Semaphore没有导致死锁?

共有1个答案

盖和泰
2023-03-14

如果实现不知道请求线程是否已经拥有锁,在公平锁定策略的情况下,来自同一线程的新请求将排在先前请求之后,可能来自其他线程。

如果在此重入请求之前有来自其他线程的写请求,则它们无法前进,因为持有锁的线程也被阻止等待其重入请求。导致僵局。

不公平的锁定策略不会遇到这个问题,因为可重入请求可以跳转队列(阻塞),并且不需要等待之前的请求。

信号量不会受到这个问题的影响,因为它不是可重入的。

 类似资料:
  • 本文向大家介绍ReentrantLock源码详解--公平锁、非公平锁,包括了ReentrantLock源码详解--公平锁、非公平锁的使用技巧和注意事项,需要的朋友参考一下 问题 (1)重入锁是什么? (2)ReentrantLock如何实现重入锁? (3)ReentrantLock为什么默认是非公平模式? (4)ReentrantLock除了可重入还有哪些特性? 简介 Reentrant = Re

  • API文档说明: 这个类的构造函数接受一个可选的公平性参数。当设置为true时,在争用状态下,锁倾向于授予对等待时间最长的线程的访问权限。 注意,锁的公平性并不能保证线程调度的公平性。因此,使用公平锁的许多线程中的一个可以连续多次获得它,而其他活动线程没有进展,并且当前没有持有锁。 我无法理解第2点: 如果一个线程连续多次获得锁,那么根据第1点,其他线程将等待更长时间,这确实意味着它们下次将获得锁

  • 本文向大家介绍请讲一下非公平锁和公平锁在reetrantlock里的实现过程是怎样的。相关面试题,主要包含被问及请讲一下非公平锁和公平锁在reetrantlock里的实现过程是怎样的。时的应答技巧和注意事项,需要的朋友参考一下 考察点:锁 如果一个锁是公平的,那么锁的获取顺序就应该符合请求的绝对时间顺序,FIFO。对于非公平锁,只要CAS设置同步状态成功,则表示当前线程获取了锁,而公平锁还需要判断

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

  • 如何写一个简单的公平锁模拟新的? 自定义不公平锁(我不确定它是否正确)

  • 我已经通过接受了公平和非公平纪律的测试。我写了一个模拟哲学家吃饭的小程序。 每个哲学家都有左右叉子,分别是s。我模拟了1000次思考和进食行为: 在哪里 没什么意思,只是睡了一段时间而已。下面是eat的