2011-10-06 18 views
7

Me doy cuenta de que el bloque sincronizado proporcionado en Java es básicamente una implementación de un mutex reentrante. Sin embargo, ¿el bloque sincronizado es atómico?Bloque sincronizado - Java

Entonces, ¿cómo se manejan las interrupciones para los hilos que se están ejecutando actualmente dentro del bloque sincronizado? ¿Libera simplemente el bloqueo revocando todos los cambios realizados hasta el momento?

EDITAR: Con respecto a la parte de interrupciones de la pregunta, ¿cómo se maneja generalmente en Java. Por ejemplo, veo muchos ejemplos de código Java en los que los desarrolladores detectan una interrupción cuando (digamos) un hilo está en la cola de espera. Sin embargo, dentro del bloque catch todo lo que hacen es imprimir que se ha producido una interrupción. Tengo más curiosidad sobre lo que realmente le sucede a ese hilo? ¿Se lo quitó de la lista de espera?

Respuesta

4

- atomicidad

bloques sincronizados ayudan a poner en práctica la atomicidad - pero sus operaciones de datos no pueden ser garaunteed atómica. Para hacer las cosas en un bloque atómico sincronizado, utiliza a menudo estructuras de datos atómicos como getters y setters, por ejemplo, AtomicBoolean.

Hay una cornucopia de grandes clases atómicas, como arreglos int atómicos, compatibles con la última versión de Java.

- cómo se gestionan las interrupciones:

interrupciones no se manejan de manera explícita por la sincronización - bloques síncronos solamente gaurantee que, durante la ejecución, el bloque no puede ser volvió a entrar por otro subproceso.

2

Sin embargo, ¿el bloque sincronizado es atómico?

Sí, un bloque sincronizado exige que este bloque y cualquier bloque que esté sincronizado en el mismo objeto sean atómicos.

¿Cómo se manejan las interrupciones:

Las interrupciones son completamente diferentes a la sincronización en Java. Cada subproceso tiene un indicador interruptedStatus que se establece siempre que llame al interrupt() en el subproceso. Los métodos como Thread.sleep() lanzan una InterruptedException si el indicador de interrupción está configurado y detienen su suspensión.

Tenga en cuenta que Thread.sleep() no abandona ningún bloqueo durante el período de suspensión. El bloqueo asociado con un bloque sincronizado solo se libera cuando la ejecución sale del bloque.

+0

Así que, básicamente, es hasta un programador para atrapar el evento Interrumpir y renunciar al bloqueo en caso de que esté dentro del bloque sincronizado? – Hari

+0

@Titan El bloque sincronizado es más equivalente a un bloqueo de ámbito, por lo que renunciar al bloqueo se realiza simplemente dejando ese ámbito. Tenga en cuenta que los eventos de interrupción son simplemente un mecanismo para el control de subprocesos de bajo nivel, mientras que podrían usarse en momentos similares, son conceptos ortogonales. – Bringer128

1

Así que básicamente es hasta un programador para capturar el evento de interrupción y renunciar a la cerradura en caso de su interior del bloque sincronizado?

No es necesario que manipule la cerradura. Como está escrito en el JLS 14.18La Declaración sincronizada:

Si la ejecución del bloque se completa con normalidad, entonces el bloqueo está desbloqueado y la declaración sincronizado se completa con normalidad.Si la ejecución del bloque se completa abruptamente por cualquier motivo, entonces el bloqueo se desbloquea y la instrucción sincronizada completa abruptamente por el mismo motivo.

Cuestiones relacionadas