2011-01-02 23 views
5

¿Alguien sabe los efectos del bloqueo en Java específicamente en la velocidad de ejecución del programa? si hay alguno, ¿cómo superamos este efecto? se agradecen las referencias concretas.efectos de bloqueo en Java

+0

Las "bajadas de velocidad" con bloqueo (de cualquier método de sincronización) están relacionadas con la cantidad de contención. 1) Evite el uso excesivo de hilos y "sincronice todo" - la concurrencia con el enhebrado toma tiempo para pensar 2) Punto de referencia * sus casos particulares * 3) Considere enfoques alternativos de algoritmo (por ejemplo, reducir bloqueos/estado compartido) 4) 'te preocupes por eso * :-) –

Respuesta

4

Si su aplicación es principalmente de una sola rosca, es posible que vea una degradación del rendimiento nula o muy poca al realizar demasiados bloqueos.

En general, un solo bloqueo se puede tomar de forma rápida y eficiente cuando se utilizan las bibliotecas java.concurrent o la palabra clave sincronizada incorporada. Utilizan técnicas como bloqueo de elisión, bloqueo adaptativo y engrosamiento de bloqueo (consulte Synchronization optimizations in Mustang), lo que básicamente significa que el compilador y/o la biblioteca hacen algunas cosas muy inteligentes para optimizar el uso del bloqueo.

Esto se desarrolla especialmente en situaciones donde la cerradura no sería realmente necesaria; el compilador lo optimiza.

Sin embargo, cuando un lote de hilos necesita agarrar los mismos bloqueos, eventualmente notará que la carga de la CPU de sus núcleos nunca alcanzará el 100% por un problema de cómputo puro. En efecto, algo no va tan rápido como podría, y tu CPU simplemente está inactiva.

En ausencia de EO (pesado), esto es a menudo un signo de lock contention excesivo y esto de hecho degrada el rendimiento general del sistema.

+0

ese artículo era lo que estaba buscando. ¡Gracias! – OckhamsRazor

1

Estoy de acuerdo con @pst y me gustaría añadir que, aunque dicen que la sincronización reduce el rendimiento, no vi estos efectos en mis pruebas. Traté de medir cómo es esta reducción y vi que esto casi no existe. Probablemente este efecto fue más relevante durante los primeros días de Java.

Ejemplo de intentos para evitar la sincronización adicional es una implementación del método getInstance() en el patrón singleton. La forma más simple es sincronizar este método que (probablemente) causa la degradación del rendimiento. El siguiente paso (que no funciona) es un bloqueo de doble verificación. Y, finalmente, la mejor solución es pasar la referencia a la instancia a la clase interna.

+0

gracias por tu ayuda! – OckhamsRazor

+0

fyi, dcl realmente funciona si usa una instancia volátil. pero la expresión "inicializar en el titular de la demanda" que describes es absolutamente mejor y más rápida para la inicialización lenta que dcl o la sincronización. –

2

Aquí están los enlaces útiles Runtime performance optimizations y Synchronization performance tips y Java synchronization and performance in an aspect en SO.

Si está escribiendo programación multiproceso, use el paquete java.util.concurrent en lugar de wait() notify() sleep() stop() enfoques antiguos.

La concurrencia es un tema realmente crítico que no se puede decir cómo afecta la velocidad de ejecución. Si se ejecuta correctamente, es bueno, si no, no

+0

gracias por su ayuda! – OckhamsRazor

3

El costo de bloqueo varía con las diferentes versiones de Java. Para Java < = 1.4 el bloqueo era relativamente caro. Sin embargo, para Java 5.0 se mejoró el bloqueo incorporado, pero el nuevo bloqueo simultáneo fue más rápido nuevamente. En Java 6, ambos son tan rápidos como los demás.

Como guía, se puede esperar que el coste de bloqueo para estar entre 0,5 y 2,0 microsegundos en Java 6.

Realizar un bloqueo puede ser caro, ya que implica una llamada al sistema operativo subyacente. (Más caro en máquinas virtualizadas) Una forma de evitarlo es usar la operación CAS con una barrera de memoria.

Sin embargo, la forma más simple/mejor para reducir el costo de bloqueo es estructurar su programa para que los hilos puedan ejecutarse por períodos de tiempo más largos sin depender el uno del otro.

Puede encontrar este enlace interesante ya que hablan del uso de bloqueo en un sistema de comercio de alto rendimiento escrito en Java. http://www.infoq.com/presentations/LMAX

+0

muy buen enlace. ¡gracias! – OckhamsRazor

1

El bloqueo (o más formalmente, la serialización de cualquier tipo) en cualquier algoritmo limita su escalabilidad en un entorno multi-cpu/multi-machine. Amdahl's Law lo describe mejor.

El bloqueo, aunque en la práctica (en Java) tendrá una sobrecarga insignificante en un programa puramente secuencial. Como se describe en otro lugar aquí, los problemas de rendimiento solo ocurren si tiene una disputa.