我有一个ReentrantLock,很多操作都锁定在它上面,这是用new ReentrantLock(true)
创建的。是否有一种方法可以让线程“插入”到锁上,并在它被释放后,在任何其他线程之前获取它?
我考虑了各种定时和非定时tryLock
的组合。
tryLock()
本身就会插入锁,但不会等待锁变得可用。还是我错了?
发布于 2013-12-03 00:31:13
正如您可以看到的这里,ReentrantLock
使用AbstractQueuedSynchronizer
作为实际的线程队列实现。考虑到它的任何方法都是不可重写的,您不能轻松地做到这一点,即用优先级队列替换标准线程队列。
但是,正如它在文档中所说的那样:“这个类为同步提供了一个高效和可伸缩的基础,部分方法是将它的使用范围专门化到可以依赖于int状态、获取和发布参数的同步器以及内部FIFO等待队列。如果这还不够,您可以使用原子类、您自己的自定义java.util.Queue类和LockSupport阻塞支持从较低级别构建同步器。”
这就是你需要做的:建立你自己的锁。您的主要目标是让release
方法使用优先级队列来做出决定。如果性能不是问题,您只需使用标准PriorityQueue,只需使用synchronized
、ReentrantLock
或任何其他标准锁即可使其读取和写入线程安全。线程安全优先级队列很难获得。但是,如果性能很重要,您可能会对2003年的本论文感兴趣。
但是,由于用户可以在任何给定的时间修改线程的优先级,所以在获得下一个线程之前,只使用基本队列并使用稳定排序 (不扰乱具有相同优先级的线程顺序)可能是最简单的。当然,如果要将其用于高争用临界部分,则性能会很差。
https://stackoverflow.com/questions/20340230
复制相似问题