thread safety safe method español java thread-safety

safety - thread safe method java



¿Cuál es la diferencia entre el método sincronizado(este) y el método sincronizado? (3)

Digamos que tenemos estos 2 ejemplos de código:

public synchronized void getSomething(){ this.hello = "hello World"; }

y éste

public void getSomething(){ synchronized(this){ this.hello = "hello World"; } }

Entonces, ¿alguien puede decirme cuál es la diferencia ahora?


Echa un vistazo a esta parte de este artículo:

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

Explica que, si bien es funcionalmente congruente (la sincronización de un método se bloquea en el objeto de instancia 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 el código de bytes (como hacen las sentencias de bloque sincronizadas), se sincroniza en el nivel de JVM.


Los dos métodos diferentes son funcionalmente equivalentes . Puede haber una diferencia de rendimiento muy pequeña:

En el nivel de bytecode, el método sincronizado anuncia su necesidad de sincronización como un bit establecido en el indicador de acceso del método. La JVM busca este indicador de bit y se sincroniza adecuadamente.

El bloque sincronizado implementa su sincronización a través de una secuencia de operaciones de bytecode almacenadas en la definición del método del archivo de clase.

Por lo tanto, el método sincronizado podría ejecutarse un poco más rápido y ocupar menos espacio en términos de bytecode.

Nuevamente, los dos son, por especificación, funcionalmente idénticos.

Supongo que la diferencia de rendimiento es insignificante y que las pautas de estilo de código deberían ganar. Algunos compiladores pueden incluso optimizar el bloque en un indicador de acceso. Y JIT puede quitar la diferencia de rendimiento.


Una diferencia es la granularidad del código que está sincronizado. En el primer ejemplo, básicamente 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. Es mejor bloquear solo cuando sea necesario y liberar ese bloqueo para otros subprocesos lo antes posible.