在CountDownLatch上等待的线程是否以fifo顺序执行?

时间:2018-03-13 12:31:02

标签: java multithreading countdownlatch

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

一样

假设我有两个线程(T1,T2)在等待锁存器。 假设T1首先出现并调用了latch.await(),之后又出现了T2

当锁存器倒计数时,保证首先执行T1,然后再执行T2

2 个答案:

答案 0 :(得分:1)

不,没有这样的保证,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();
}

答案 1 :(得分:0)

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