Основное различие заключается в том, что volatile
создает отношение "до того, как произошло", между записью в переменную volatile
и последующим чтением из нее, тогда как synchronized
создает отношения "до и после" между разблокировкой и последующей блокировкой.
Таким образом, в случае SynchronizedInteger
создается связь «до того» между любыми последовательными операциями с вызовами SychrozniedInteger
(т.е. get()
и set()
), и не имеет значения, являются ли они чтением или записью , Он отличается от поведения volatile int
, которое обеспечивает «до и только» между записью и последующим чтением.
На самом деле я не могу представить какой-либо значимый пример, чтобы проиллюстрировать это различие, так что эти поведения действительно отличаются незначительно.