Countdownlatch get count возвращает несовместимые значения - PullRequest
0 голосов
/ 09 февраля 2019

Я разработал пример 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

WORKER-4 завершено.

Счет возвращается как 2 для двух раз в выходных данных.Что-то не так в моем коде?

Ответы [ 2 ]

0 голосов
/ 09 февраля 2019

Четыре Worker работают одновременно.Поскольку 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
0 голосов
/ 09 февраля 2019

Это не проблема. Как 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();
}
...