2012-02-24 22 views
19

Sigo leyendo acerca de cómo el bloqueo sesgado, usando el indicador -XX: + UseBiasedLocking, puede mejorar el rendimiento de la sincronización sin supervisión. No pude encontrar una referencia de lo que hace y cómo mejora el rendimiento.Bloqueo parcial en java

¿Alguien puede explicarme qué es exactamente o puede indicarme algunos enlaces/recursos que explican?

Respuesta

26

En esencia, si los objetos están bloqueados por un solo hilo, la máquina virtual puede realizar una optimización y " sesgar "ese objeto a ese hilo de tal manera que las operaciones atómicas subsiguientes sobre el objeto no incurran en ningún costo de sincronización. Supongo que esto normalmente está orientado hacia un código demasiado conservador que realiza bloqueos en los objetos sin exponerlos a otro hilo. La sobrecarga de sincronización real solo se activará una vez que otro subproceso intente obtener un bloqueo en el objeto.

Es activado por defecto en Java 6.

-XX: + UseBiasedLocking Permite una técnica para mejorar el rendimiento de la sincronización uncontended. Un objeto es "sesgado" hacia el hilo que primero adquiere su monitor a través de un código de bytes monitorenter o invocación de método sincronizado; las operaciones subsecuentes relacionadas con el monitor realizadas por ese hilo son relativamente mucho más rápidas en máquinas multiprocesador. Algunas aplicaciones con cantidades significativas de sincronización no controlada pueden lograr aceleraciones significativas con esta bandera habilitada; algunas aplicaciones con ciertos patrones de bloqueo pueden ver ralentizaciones, aunque se han realizado intentos para minimizar el impacto negativo.

5

¿Esto no responde a sus preguntas?

http://www.oracle.com/technetwork/java/tuning-139912.html#section4.2.5

Permite una técnica para mejorar el rendimiento de uncontended sincronización. Un objeto está "sesgado" hacia el hilo que primero adquiere su monitor a través de un código de bytes monitorenter o método de invocación sincronizada; las operaciones subsecuentes relacionadas con el monitor realizadas por ese subproceso son relativamente mucho más rápidas en máquinas multiprocesador. Algunas aplicaciones con cantidades significativas de sincronización no reconocida pueden lograr aceleraciones significativas con este indicador habilitado; algunas aplicaciones con ciertos patrones de bloqueo pueden ver ralentizaciones, aunque se han realizado intentos para minimizar el impacto negativo .

Aunque creo que lo encontrarás de manera predeterminada en 1.6. Use la opción de diagnóstico PrintFlagsFinal para ver cuáles son los indicadores efectivos. Asegúrese de especificar -server si está investigando para una aplicación de servidor debido a las banderas pueden ser diferentes:

http://www.jroller.com/ethdsy/entry/print_all_jvm_flags

3

Me he estado preguntando acerca de los bloqueos parciales yo mismo.

Sin embargo, parece que los bloqueos sesgados de Java son más lentos en los procesadores nehalem de Intel que los bloqueos normales, y presumiblemente en las dos generaciones de procesadores desde nehalem.Ver http://mechanical-sympathy.blogspot.com/2011/11/java-lock-implementations.html y aquí http://www.azulsystems.com/blog/cliff/2011-11-16-a-short-conversation-on-biased-locking

también más información aquí https://blogs.oracle.com/dave/entry/biased_locking_in_hotspot

He estado esperando que haya alguna manera relativamente barata de revocar una cerradura sesgada en Intel, pero estoy empezando a creer que no es posible. Los artículos que he visto sobre cómo se hace dependen de: 1) usando el sistema operativo para detener el hilo 2) enviando una señal, es decir, ejecutando el código en el otro hilo 3) teniendo puntos de seguridad garantizados para funcionar con justicia a menudo en el otro hilo y esperando que se ejecute uno (que es lo que hace java). 4) tener puntos de seguridad similares que son una llamada a una devolución, y el otro hilo MODIFICAR EL CÓDIGO a un punto de interrupción ...