Должно ли чтение поля 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 шт):
Синхронизация метода чтения нужна для int тоже.
Помимо атомарности synchronized также гарантирует, что чтение переменной всегда возвращает последнее записанное в неё значение.
Обычно именно это и подразумевают под "синхронизацией".
Если у метода чтения убрать synchronized, то возникает так называемая гонка (data race).
В этом случае чтение каждый раз может рандомно возвращать любое из значений, когда-либо записанных в эту переменную с момента запуска программы.