В первом случае вы синхронизируете общедоступный объект (A.class
), и поэтому другие части приложения могут вызвать проблемы, поскольку они также синхронизируются на A.class
.
Во втором случае вы синхронизируете объект с частной блокировкой и, таким образом, уверены, что никто другой не использует блокировку для синхронизации доступа к чему-либо еще.
Более того, как указано в других ответах, все экземпляры класса будут синхронизироваться в одной и той же блокировке с первым решением, тогда как каждый экземпляр будет иметь свою собственную блокировку со вторым решением.
Второе решение, таким образом, гораздо предпочтительнее (хотя объект блокировки должен быть окончательным).