С указанным объемом кода оба подхода эквивалентны. Это не означает, что они эквивалентны при всех обстоятельствах.
synchronized(x)
устанавливает блокировку на x
, поэтому в целом вы должны синхронизировать, используя объект, общий для всех потоков, использующих общие ресурсы. Если потоки используют один общий ресурс (например, список), то синхронизация по этому списку работает. Если потоки совместно используют более одного ресурса, вам необходимо выполнить синхронизацию на отдельном объекте, чтобы контролировать доступ к этим общим ресурсам. Это может быть объект или this
в зависимости от контекста.
synchronized(this)
также предотвращает взаимное исключение между методами класса, так что, или синхронизированные методы полезны, если состояние объекта необходимо изменить потокобезопасным способом.