Sobes.tech
Назад к вопросам
Senior
5

Задача по коду: synchronized get/set и многопоточность (скриншот с кодом)

Компании, где спрашивали
Позитив Технолоджис

Ответ от нейросети

sobes.tech AI

В Java для обеспечения потокобезопасного доступа к данным часто используют ключевое слово synchronized. Оно позволяет синхронизировать методы или блоки кода, чтобы только один поток мог выполнять их одновременно.

Пример synchronized get/set для поля с многопоточностью:

public class Counter {
    private int count = 0;

    public synchronized int getCount() {
        return count;
    }

    public synchronized void setCount(int count) {
        this.count = count;
    }

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

Здесь методы getCount, setCount и increment синхронизированы, что гарантирует атомарность операций и предотвращает состояние гонки.

Если нужно более тонкое управление, можно использовать блоки synchronized:

public class Counter {
    private int count = 0;
    private final Object lock = new Object();

    public int getCount() {
        synchronized(lock) {
            return count;
        }
    }

    public void setCount(int count) {
        synchronized(lock) {
            this.count = count;
        }
    }
}

Это позволяет синхронизировать только необходимые участки кода, улучшая производительность.

Для более сложных сценариев стоит рассмотреть использование java.util.concurrent пакета, например, AtomicInteger или ReentrantLock.