Por supuesto, "sincronizado" es solo azúcar sintáctico: increíblemente útil azúcar sintáctica.
Si quieres programas Java sin azúcar, se debe escribir directamente en el código de bytes de Java del MonitorEnter, MonitorExit, bloqueo y desbloqueo operaciones referencia en VM Specifications 8.13 Locks and Synchronization
Hay es un bloqueo asociado con cada objeto. El lenguaje de programación Java no proporciona una forma de realizar operaciones de bloqueo y desbloqueo por separado ; en su lugar, son implícitamente realizadas por construcciones de alto nivel que siempre organizan el emparejamiento de tales operaciones correctamente. (La máquina virtual Java , sin embargo, proporciona separadas MonitorEnter y MonitorExit instrucciones que implementan el bloqueo y desbloquear operaciones.)
La declaración sincronizado calcula una referencia a un objeto; entonces intenta realizar una operación de bloqueo en ese objeto y no continúa hasta que la operación de bloqueo haya finalizado con éxito . (A operación de bloqueo puede retrasarse porque los reglas acerca de cerraduras puede evitar que el principal memoria de participar hasta que algún otro hilo está listo para realizar una o más operaciones de desbloqueo.) Después de la operación bloqueo ha sido realizado, la el cuerpo de la instrucción sincronizada es ejecutado. Normalmente, un compilador para el lenguaje programación Java asegura que la operación de bloqueo implementado por una instrucción MonitorEnter ejecutado antes de la ejecución del cuerpo de la declaración sincronizado está adaptada por una operación de desbloqueo implementado por una instrucción MonitorExit siempre la instrucción sincronizada completa, si la finalización es normal o abrupta.
Un método sincronizado automáticamente realiza una operación de bloqueo cuando se invoca ; su cuerpo no se ejecuta hasta que la operación de bloqueo haya finalizado con éxito . Si el método es un método de instancia, se bloquea la cerradura asociado a la instancia para la que se invocó (es decir, el objeto que se conoce como este durante la ejecución del cuerpo del método ). Si el método es estático, bloquea el bloqueo asociado con el objeto de clase que representa la clase en la que se define el método. Si la ejecución del cuerpo del método ha sido completa, ya sea normalmente o abruptamente, una operación de desbloqueo es ejecutada automáticamente en ese mismo bloqueo .
La mejor práctica es que si una variable es en ser asignada por un hilo y utilizado o asignado por la otra, entonces todo accesos a esa variable debe ser encerrado en métodos sincronizados o declaraciones sincronizados.
Aunque un compilador para el lenguaje de programación Java normalmente garantías estructurada uso de cerraduras (véase la Sección 7.14, "sincronización"), no existe seguridad de que todo el código sometido a la máquina virtual de Java oído a este propiedad. Las implementaciones de la máquina Java virtual están permitidas pero no son necesarias para hacer cumplir las dos reglas siguientes que garantizan el bloqueo estructurado.
Deje que T sea un hilo y L sea un candado. Entonces:
El número de operaciones de bloqueo realizadas por T en L durante una invocación de método debe ser igual al número de desbloquear operaciones realizadas por T en L durante la invocación del método si la invocación del método completa normalmente o abruptamente.
En ningún momento durante una invocación de método puede el número de operaciones de desbloqueo realizadas por T en L desde el método de invocación exceder el número de las operaciones de bloqueo realizado por T en L desde la invocación del método.
En términos menos formales, durante un método invocación de cada operación de desbloqueo en L debe coincidir con alguna operación precedente bloqueo sobre L.
Tenga en cuenta que el bloqueo y desbloqueo automáticamente realizado por el Java la máquina virtual cuando se invoca un método sincronizado se considera que ocurre durante la invocación del método de llamada .
Ciertamente no lo es. ¿Puedes citar las fuentes donde has escuchado esto? – BalusC
@BalusC: ver la respuesta aceptada. Creo que las fuentes simplemente se estaban refiriendo a los * métodos * sincronizados como azúcar sintáctico. No estoy seguro de si eso es exactamente correcto o no, pero al menos no contradice mis hallazgos, como pensé que era. @skaffman: podría haberlo hecho mal sin 'sincronizar' por todo lo que sabía :) – Cam
@incrediman' synchronized' en un método es más o menos lo mismo que poner el cuerpo del método en 'sincronizado (esto) {...} '(o para un método estático' sincronizado (MyClass.class) {...} '). (Se representa de forma diferente en los archivos de clase, pero eso no debería preocuparlo). –