我有一个ReentrantLock,一堆操作正在锁定,与new ReentrantLock(true)
创建的公平。是否有一种方法让一个线程“插入”锁定并在它被释放之后但在任何其他线程之前获取它?
我考虑了定时和不定时tryLock
的各种组合:
tryLock()
如果已经解锁并且线程正在等待,它将自己插入锁定,但不会等待锁定变为可用。或者我错了?
答案 0 :(得分:1)
正如您所见here,ReentrantLock
使用AbstractQueuedSynchronizer
作为实际的线程队列实现。看看它的方法是如何被覆盖的,你不能轻易做到这一点,即用优先级队列替换标准线程队列。
但正如文档中所述:“此类通过将其使用范围专门化为可依赖于int状态,获取和释放参数的同步器以及内部FIFO等待,为同步提供了有效且可扩展的基础。如果这还不够,可以使用原子类,自己的自定义java.util.Queue类和LockSupport阻塞支持从较低级别构建同步器。“
这就是你需要做的事情:建立你自己的锁。您的主要目标是让release
方法使用优先级队列来做出决定。如果性能不是问题,您可以使用标准PriorityQueue,您可以使用synchronized
,ReentrantLock
或任何其他可用的标准锁来使其读写线程安全。线程安全的优先级队列很难得到。但是,如果表现很重要,那么2003年的this paper可能会让您感兴趣。
但是,由于用户可以在任何给定时间修改线程的优先级,因此最简单的方法就是使用基本队列并使用stable sort(以免混乱具有相同优先级的线程顺序)得到下一个人。当然,如果你想将它用于高竞争关键部分,性能会很差。