>假设我有一个倒计时闩锁,就像 count=1 一样
假设我有两个线程(T1、T2(在闩锁上等待。假设 T1 先来,称为 latch.await((,后来是 T2
当锁存器倒计时时,是否可以保证 T1 将首先执行,然后再执行 T2
不,没有这样的保证,CountDownLatch
剂量没有公平的政策。
但是,ReentrantLock
和Condition
有公平的政策:
等待线程以 FIFO 顺序发出信号。
从等待返回的线程的锁重新获取顺序 方法与最初获取锁的线程相同,后者 在默认情况下未指定,但对于公平锁有利于那些 等待时间最长的线程。
因此,如果您希望等待线程按 fifo 顺序唤醒,您可以将 CountDownLatch
和 Condition
结合起来:
创建一个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 上(,线程获取锁(信号量或互斥锁(的顺序永远无法保证。如果一个线程具有更高的优先级,那么从逻辑上讲,这应该会有所作为,但这超出了我的经验,所以我不能说它在实践中是否如此。