volatile
гарантирует, что читает из переменная всегда отражает самое актуальное для обновления значение. Среда выполнения может добиться этого различными способами, включая отказ от кэширования или обновления кэша при изменении значения.
Из a с точки зрения клиента, частное изменяемое поле скрыто от общедоступного интерфейса, в то время как синхронизированные методы более заметны.
Чтобы ответить на часть 3 вашего вопроса и частично на часть 2.
Нет функциональной разницы между synchronized
и volatile
образцов.
Однако каждый из них имеет свои недостатки с точки зрения производительности. В некоторых случаях производительность volatile
может быть действительно хуже, чем простое использование synchronized
или других примитивов из java.util.concurrent
. Для обсуждения этого см. -> Почему переменные в Java не являются изменчивыми по умолчанию? .