假设我有一个倒计时锁定,就像count = 1
一样假设我有两个线程(T1,T2)在等待锁存器。 假设T1首先出现并调用了latch.await(),之后又出现了T2
当锁存器倒计数时,保证首先执行T1,然后再执行T2
答案 0 :(得分:1)
不,没有这样的保证,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();
}
答案 1 :(得分:0)
根据底层操作系统管理线程的方式,这可能会有所不同,但根据我的经验(在Windows上),线程获取锁定(信号量或互斥锁)的顺序永远不会得到保证。如果一个线程具有更高的优先级,那么逻辑上应该有所作为,但这不符合我的经验,所以我不能说它是否在实践中。