2011-12-29 11 views
6

En el famoso Java Concurrency in Practice, sección 2.4, dice que el enfoque de bloqueo intrínseco, en contra de bloqueos explícitos era una mala decisión de diseño porque es confuso y también "... obliga a los implementadores de JVM a hacer intercambios entre el tamaño del objeto y el bloqueo actuación." ¿Puede alguien explicar por favor cómo el tamaño del objeto afecta el rendimiento de bloqueo?¿Existe una relación entre el tamaño del objeto y el rendimiento de bloqueo en Java?

+1

No debe haber relación con el tamaño con bloqueos de tipo 'sincronizado' (según mi experiencia al implementar esto), y de una breve reseña de Java 5 esquema de bloqueo, no veo de manera directa cómo podría haber una dependencia allí tampoco. Obviamente requiere más almacenamiento, por supuesto, implementar los objetos 'Lock' por separado, pero eso debe ser una sobrecarga fija. –

+0

@HotLicks eso es lo que me sorprendió, el tamaño no tiene gastos adicionales, ¡gracias! – meer

Respuesta

5

Bien, ya que cada objeto puede ser bloqueado, esto significa que cada objeto debe tener suficiente lugar para almacenar toda la información que necesitamos al bloquear.

Eso no es atractivo porque la gran mayoría de los objetos nunca estarán bloqueados, por lo que estamos desperdiciando mucho espacio. Entonces, en la práctica, Hotspot resuelve esto usando 2bits para registrar el estado del objeto y reutilizar el resto del encabezado del objeto dependiendo de estos dos bits.

Luego está toda la información de bloqueo sesgada/no sesgada ... bueno, puede comenzar a leer al respecto here. La documentación de Hotspot no es lo que yo llamaría extensa, pero los encabezados de bloqueo y de objeto están mejor representados que la mayoría del resto. Pero en duda: lee el código fuente.

PD: También tenemos un problema similar con el código hash nativo de cada objeto. "Simplemente use la dirección de memoria" no es muy buena si su GC mezcla objetos alrededor. (Pero al contrario que con el bloqueo no hay una alternativa real, si queremos esta funcionalidad)

+0

gracias por la información, básicamente se trata de todas las sincronizaciones primitivas, independientemente del tamaño del objeto particular utilizado para el bloqueo – meer

+0

¿tiene alguna información específica para ir con esas declaraciones? "¿mucho espacio? ¿Qué información se necesita cuando se bloquea? – Toby

+0

@Toby Bueno, al menos, el TID y un contador de recursividad. Para más detalles, tendrá que mirar las pesadas clases de bloqueo en la fuente del punto de acceso. Teniendo en cuenta que esto se agrega a cada objeto, incluso 1-2 palabras son "mucho espacio". – Voo

2

Los bloqueos más eficientes usan el tamaño de palabra nativo p. Ej. Campos de 32 bits. Sin embargo, no desea agregar 4 bytes a cada objeto, por lo que se usa AFAIK 1 bit, sin embargo, establecer este bit es más caro que establecer un tamaño de palabra.

+0

Hmm ¿podemos hacerlo sin un CAS incluso si usamos campos de tamaño de palabra? Si no es básicamente solo lectura + mezcla de bits + CAS contra CAS - probablemente no tan mal, pero aún más lento. – Voo

+0

@Voo no es tan malo en mi experiencia como 'sincronizado' puede ser optimizado por el JIT es maneras de bloqueo no lo es. –

+0

Estoy hablando de la implementación sincronizada. Incluso si usáramos un encabezado de bloqueo con palabras, aún necesitaríamos un CAS que debería dominar la mezcla de bit, por lo que no hay mucha diferencia allí. Sin embargo, probablemente estamos hablando el uno del otro. – Voo

Cuestiones relacionadas