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 предпочтительнее для производительности и простоты.