Junior — Middle
Hogyan biztosítható, hogy 2000 érték visszatérjen olyan helyzetekben, amikor két szál egyidejűleg növeli a kezdetben nulla értékű volatile változót?
sobes.tech MI
Válasz az MI-től
Переменная, объявленная как 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 предпочтительнее для производительности и простоты.