Countdownlatch get count возвращает несовместимые значения
Я разработал пример Java-программы для понимания countdownlatch и инициализировал countdownlatch со счетчиком 4. Я ожидал, что после метода countDown getCount() вернет оставшееся количество для countdownlatch. Но в следующем примере:
public static void main(String args[]) throws InterruptedException {
CountDownLatch latch = new CountDownLatch(4);
Worker first = new Worker(latch, "WORKER-1");
Worker second = new Worker(latch, "WORKER-2");
Worker third = new Worker(latch, "WORKER-3");
Worker fourth = new Worker(latch, "WORKER-4");
first.start();
second.start();
third.start();
fourth.start();
latch.await();
System.out.println("Final Count:- " + latch.getCount());
}
}
class Worker extends Thread {
private CountDownLatch latch;
public Worker(CountDownLatch latch, String name) {
super(name);
this.latch = latch;
}
@Override
public void run() {
latch.countDown();
System.out.println("Count:- " + latch.getCount());
System.out.println(Thread.currentThread().getName() + " finished");
}
}
Выход:
Количество:- 2
Количество:- 1
Количество:- 2
РАБОТНИК-3 закончен
РАБОТНИК-1 закончен
РАБОТНИК-2 закончен
Количество:- 0
Конечный счет:- 0
РАБОТНИК-4 закончен.
Счет возвращается как 2 для двух раз в выходных данных. Что-то не так в моем коде?
2 ответа
Решение
Это не проблема. Как CountDownLatch используется в многопоточности Java?
Этот метод только делает volatile
читать, а не synchronised
читать.
/**
* Returns the current count.
*
* <p>This method is typically used for debugging and testing purposes.
*
* @return the current count
*/
public long getCount() {
return sync.getCount();
}
Четверка Worker
S работают в то же время. поскольку latch.countDown();
а также latch.getCount()
не атомарны, порядок выполнения может быть:
thread1 latch.countDown();
thread2 latch.countDown();
thread1 System.out.println("Count:- " + latch.getCount()); // Count:- 2
thread2 System.out.println("Count:- " + latch.getCount()); // Count:- 2