Если и здесь вы используете «синхронизированный» на сеттере, этот код является поточно-ориентированным. Однако это может быть не достаточно зернистым; если у вас есть 20 геттеров и сеттеров, и все они синхронизированы, возможно, вы создаете узкое место синхронизации.
В этом конкретном случае, с единственной переменной int, исключение «synchronized» и пометка поля int «volatile» также обеспечит видимость (каждый поток будет видеть последнее значение «val» при вызове метода получения), но он может быть недостаточно синхронизирован для ваших нужд. Например, ожидая
int old = someThing.getVal();
if (old == 1) {
someThing.setVal(2);
}
для установки val в 2, если и только если это уже 1, неверно. Для этого вам понадобится внешняя блокировка или атомарный метод сравнения и установки.
Я настоятельно рекомендую вам прочитать Параллелизм Java на практике Брайана Гетца и др. , он наилучшим образом охватывает конструкции параллелизма Java.