优先购买可能被锁定的公平ReentrantLock

时间:2013-12-02 23:53:50

标签: java multithreading concurrency locking reentrantlock

我有一个ReentrantLock,一堆操作正在锁定,与new ReentrantLock(true)创建的公平。是否有一种方法让一个线程“插入”锁定并在它被释放之后但在任何其他线程之前获取它?

我考虑了定时和不定时tryLock的各种组合:

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

或者我错了?

1 个答案:

答案 0 :(得分:1)

正如您所见hereReentrantLock使用AbstractQueuedSynchronizer作为实际的线程队列实现。看看它的方法是如何被覆盖的,你不能轻易做到这一点,即用优先级队列替换标准线程队列。

但正如文档中所述:“此类通过将其使用范围专门化为可依赖于int状态,获取和释放参数的同步器以及内部FIFO等待,为同步提供了有效且可扩展的基础。如果这还不够,可以使用原子类,自己的自定义java.util.Queue类和LockSupport阻塞支持从较低级别构建同步器。“

这就是你需要做的事情:建立你自己的锁。您的主要目标是让release方法使用优先级队列来做出决定。如果性能不是问题,您可以使用标准PriorityQueue,您可以使用synchronizedReentrantLock或任何其他可用的标准锁来使其读写线程安全。线程安全的优先级队列很难得到。但是,如果表现很重要,那么2003年的this paper可能会让您感兴趣。

但是,由于用户可以在任何给定时间修改线程的优先级,因此最简单的方法就是使用基本队列并使用stable sort(以免混乱具有相同优先级的线程顺序)得到下一个人。当然,如果你想将它用于高竞争关键部分,性能会很差。