Назад к задачам
Junior — Senior
4

Определение результата неконтролируемого счётчика в многопоточном окружении

Получайте помощь с лайвкодингом в реальном времени с Sobes Copilot
Условие задачи

В методе main создаются два потока, работающих с одним объектом Test2:

  • первый поток (запускается через new Thread(test2).start()) вызывает метод inc() четыре раза;
  • второй поток (это основной поток main) уменьшает значение счётчика также четыре раза, вызывая dec() напрямую. Оба потока используют один и тот же экземпляр класса, поэтому операции инкремента и декремента могут происходить одновременно без синхронизации. Необходимо указать, какое значение может вернуть метод get() после завершения обеих последовательностей операций, и при каких обстоятельствах возможно получение нуля.
public class Test2 implements Runnable {

    private int counter;

    public void inc() {
        counter++;
    }

    public void dec() {
        counter--;
    }

    public int get() {
        return counter;
    }

    @Override
    public void run() {
        for (int i = 0; i < 4; i++) {
            inc();
        }
    }

    public static void main(String[] args) {
        Test2 test2 = new Test2();
        new Thread(test2).start();
        for (int i = 0; i < 4; i++) {
            test2.dec();
        }
        System.out.println(test2.get());
    }
}