Должно ли чтение поля int быть синхронизировано?

В книге Java Concurrency на практике приложен примерно такой код:

public class Counter {
    private long value = 0;

    public synchronized long getValue() {
        return value;
    }

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

Здесь поле value с типом long, а также синхронизированные методы чтения и инкремента.

Я правильно понимаю, что синхронизация метода чтения нужна лишь для типов long и double, ведь они не являются атомарными? И если поле value будет с типом int, синхронизация метода чтения будет ненужной?


Ответы (1 шт):

Автор решения: user512711

Синхронизация метода чтения нужна для int тоже.

Помимо атомарности synchronized также гарантирует, что чтение переменной всегда возвращает последнее записанное в неё значение.
Обычно именно это и подразумевают под "синхронизацией".

Если у метода чтения убрать synchronized, то возникает так называемая гонка (data race).
В этом случае чтение каждый раз может рандомно возвращать любое из значений, когда-либо записанных в эту переменную с момента запуска программы.

→ Ссылка