Sobes.tech
Junior — Middle
105

როგორ უზრუნველვყოთ მნიშვნელობის 2000 დაბრუნება იმ პირობებში, როდესაც ორი ნაკადი ერთდროულად ზრდის volatile ცვლადს, რომელიც თავდაპირველად არის ნული?

კომპანიებმა სადაც სთხოვეს
Драйв Клик

პასუხი AI-სგან

sobes.tech AI

Переменная, объявленная как volatile, гарантирует видимость изменений между потоками, но не обеспечивает атомарность операций. При одновременном увеличении переменной двумя потоками возможна потеря обновлений (race condition), и итоговое значение может быть меньше ожидаемого.

Чтобы гарантировать, что после двух одновременных инкрементов значение будет 2000, нужно использовать атомарные операции или синхронизацию.

В Java можно использовать класс AtomicInteger из пакета java.util.concurrent.atomic:

import java.util.concurrent.atomic.AtomicInteger;

public class Counter {
    private AtomicInteger count = new AtomicInteger(0);

    public void increment() {
        count.addAndGet(1000); // увеличиваем на 1000
    }

    public int getCount() {
        return count.get();
    }
}

Если два потока вызовут increment(), итоговое значение будет 2000 без потерь.

Альтернативно можно использовать синхронизированный метод:

private int count = 0;

public synchronized void increment() {
    count += 1000;
}

Но AtomicInteger предпочтительнее для производительности и простоты.