Los dos métodos diferentes son funcionalmente equivalentes. Hay puede ser una muy pequeña diferencia rendimiento:
A nivel de código de bytes, el método sincronizado anuncia su necesidad de sincronización como un bit establecido en la bandera de acceso del método. La JVM busca este indicador de bit y se sincroniza de manera adecuada.
El bloque sincronizado implementa su sincronización mediante una secuencia de operaciones de bytecode almacenadas en la definición del método del archivo de clase.
Así que el método sincronizado podría ejecutar potencialmente un poco más rápido y ocupar menos espacio en términos de bytecode.
Una vez más, los dos son, por especificación, funcionalmente idénticos.
Supongo que la diferencia de rendimiento es insignificante y las pautas de estilo de código deberían ganar. Algunos compiladores incluso pueden optimizar el bloqueo en un indicador de acceso. Y JIT puede eliminar la diferencia de rendimiento.
+1. Finalmente, un toque de los detalles mecánicos :-) –