2010-12-09 14 views

Respuesta

36

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.

+2

+1. Finalmente, un toque de los detalles mecánicos :-) –

9

Una diferencia es la granularidad del código que se sincroniza. En el primer ejemplo, esencialmente está bloqueando todo el método, mientras que en el segundo ejemplo solo se bloqueará una sección del método. El segundo enfoque es mejor para métodos largos cuyos cuerpos no necesitan estar completamente sincronizados. Lo mejor es bloquearlo solo cuando lo necesite y liberar ese bloqueo para otros hilos tan pronto como sea posible.

+1

Pero, ¿y si, como anteriormente, el bloque 'synchronized (this)' rodea el * cuerpo entero *, según los ejemplos? ¿Hay alguna diferencia en la generación de código byte o objeto monitor? –

19

Salida esta porción de este artículo:

http://www.ibm.com/developerworks/ibm/library/it-haggar_bytecode/#4

Explica que mientras que funcionalmente congruentes (sincronización de un método de cualquiera de las cerraduras en la instancia de objetos o en el caso de un método estático el objeto de clase de la clase en la que reside el método), la sincronización de un método es mucho más óptima porque, en lugar de sincronizar en bytecode (como lo hacen las instrucciones de bloque sincronizadas), se sincroniza a nivel de JVM.

+1

+1. Finalmente, un indicio de los detalles mecánicos y un buen enlace (que cubre la pregunta exacta no menos) para respaldarlo. –

+0

Se ve genial gracias. – Tarik

Cuestiones relacionadas