首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >优先收购一个可能被锁定的公平ReentrantLock

优先收购一个可能被锁定的公平ReentrantLock
EN

Stack Overflow用户
提问于 2013-12-02 23:53:50
回答 1查看 400关注 0票数 1

我有一个ReentrantLock,很多操作都锁定在它上面,这是用new ReentrantLock(true)创建的。是否有一种方法可以让线程“插入”到锁上,并在它被释放后,在任何其他线程之前获取它?

我考虑了各种定时和非定时tryLock的组合。

  • 如果锁已经被解锁,并且线程正在等待,tryLock()本身就会插入锁,但不会等待锁变得可用。
  • 与超时相同的方法是公平的。
  • 将两者结合起来是行不通的,因为如果它在开始时被锁定,基于超时的tryLock将回到公平的调度。

还是我错了?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-12-03 00:31:13

正如您可以看到的这里ReentrantLock使用AbstractQueuedSynchronizer作为实际的线程队列实现。考虑到它的任何方法都是不可重写的,您不能轻松地做到这一点,即用优先级队列替换标准线程队列。

但是,正如它在文档中所说的那样:“这个类为同步提供了一个高效和可伸缩的基础,部分方法是将它的使用范围专门化到可以依赖于int状态、获取和发布参数的同步器以及内部FIFO等待队列。如果这还不够,您可以使用原子类、您自己的自定义java.util.Queue类和LockSupport阻塞支持从较低级别构建同步器。”

这就是你需要做的:建立你自己的锁。您的主要目标是让release方法使用优先级队列来做出决定。如果性能不是问题,您只需使用标准PriorityQueue,只需使用synchronizedReentrantLock或任何其他标准锁即可使其读取和写入线程安全。线程安全优先级队列很难获得。但是,如果性能很重要,您可能会对2003年的本论文感兴趣。

但是,由于用户可以在任何给定的时间修改线程的优先级,所以在获得下一个线程之前,只使用基本队列并使用稳定排序 (不扰乱具有相同优先级的线程顺序)可能是最简单的。当然,如果要将其用于高争用临界部分,则性能会很差。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20340230

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档