等待 CountDownLatch 的线程是否按 fifo 顺序执行



>假设我有一个倒计时闩锁,就像 count=1 一样

假设我有两个线程(T1、T2(在闩锁上等待。假设 T1 先来,称为 latch.await((,后来是 T2

当锁存器倒计时时,是否可以保证 T1 将首先执行,然后再执行 T2

不,没有这样的保证,CountDownLatch剂量没有公平的政策。

但是,ReentrantLockCondition有公平的政策:

等待线程以 FIFO 顺序发出信号。

从等待返回的线程的锁重新获取顺序 方法与最初获取锁的线程相同,后者 在默认情况下未指定,但对于公平锁有利于那些 等待时间最长的线程。

因此,如果您希望等待线程按 fifo 顺序唤醒,您可以将 CountDownLatchCondition 结合起来:

创建一个ReentrantLock

 ReentrantLock lock = new ReentrantLock(true);
 Condition condition = lock.newCondition();

让 T1 和 T2 等待此条件:

lock.lock();
try {
    while (...) {
        condition.await();     
    }
} finally {
    lock.unlock();
}
doSomething();

创建一个新线程 T3 等待CountDownLatch并发出 T1 和 T2 信号:

countDownLatch.await();
lock.lock();
try {
    condition.signalAll();
} finally {
    lock.unlock();
}

这可能会根据底层操作系统管理线程的方式而有所不同,但根据我的经验(在 Windows 上(,线程获取锁(信号量或互斥锁(的顺序永远无法保证。如果一个线程具有更高的优先级,那么从逻辑上讲,这应该会有所作为,但这超出了我的经验,所以我不能说它在实践中是否如此。

最新更新