try sincronizados sincronizacion sentencia metodos hilos ejemplos catch java multithreading try-catch synchronized-block

java - sincronizados - ¿Es mejor tener un bloque sincronizado dentro de un bloque try o un bloque try dentro de un bloque sincronizado?



sincronizacion de hilos en java (6)

¿Es mejor tener un bloque sincronizado dentro de un bloque try o un bloque try dentro de un bloque sincronizado?

A menos que explícitamente necesite que el catch esté en el bloque synchronized , haría la sección de código synchronized más pequeña posible y la tendría dentro del intento / retén. Así que el primer patrón sería mejor. Luego, si necesita realizar operaciones en la sección de catch (como registrar la excepción o volver a interrumpir el hilo, vea a continuación), esto no bloquearía otros hilos.

Dicho esto, si el bloque synchronized contiene una serie de líneas (por lo general no es una buena idea), entonces consideraría mover el bloque try / catch más cerca del método que produce la excepción ( wait o notify ). Con una gran cantidad de líneas, corre el riesgo de manejar incorrectamente las excepciones con grandes bloques try / catch. Depende un poco del marco de referencia aquí.

Además, asegúrese de al menos registrar excepciones interrumpidas. Nunca los ignores. Probablemente también quieras volver a interrumpir el hilo:

try { ... } catch (InterruptedException e) { // always a good pattern Thread.currentThread().interrupt(); // handle the interrupt here by logging or returning or ... }

Por ejemplo, ¿es esto mejor?

try { synchronized (bean) { // Write something } } catch (InterruptedException e) { // Write something }

O es mejor esto:

synchronized (bean) { try { // Write something } catch (InterruptedException e) { // Write something } }

Me preguntaba cuál es la mejor práctica. Obviamente considerando que tengo que sincronizar todo el código dentro del bloque try. No estoy hablando del caso, tengo que sincronizar solo parte del código dentro del intento (en este caso creo que sería mejor tener el bloque de sincronización dentro del intento). Mis dudas son sobre el caso en el que tengo que sincronizar todo el bloque try.


¿Importa si tu bloque catch está sincronizado? Ya que tienes "escribir algo", asumo que vas a hacer un registro que no debería estar sincronizado con un buen marco de registro, lo que significaría que la respuesta es probablemente no .

En general, su objetivo debe ser utilizar la menor sincronización posible. Cuanto menor sea el bloqueo de sincronización, menor será la probabilidad de que tenga problemas.


En este caso, InterruptedException solo puede ocurrir dentro del bloque synchronized , donde puede llamar a la wait sleep o notify .

En general, la mejor práctica es colocar el bloque try/catch tan cerca del código que pueda generar una excepción para que sea fácil identificar el código que se debe corregir.


No hay mejores prácticas. Solo depende si necesita la parte de manejo de excepciones dentro del bloque sincronizado o no. Es posible que desee uno u otro, y debería elegir el que haga que el bloqueo sincronizado sea el más corto, al mismo tiempo que el código sea correcto y seguro para subprocesos.


No tiene nada que ver con synchronized{try{}} o try{synchronized{}} , pero todo tiene que ver con synchronized{catch{}} o synchronized{} catch{} . Realmente depende de lo que haces en el bloque catch.

Sin embargo, al adivinar, para InterruptedException , normalmente debería catch{} fuera de synchronized{} .


Parece que piensas que esto es sólo una cuestión estética. No lo es Es una pregunta funcional y la respuesta está dictada por el requisito en cada caso individual. Cada bloque sincronizado debe ser tan grande como sea necesario para contener lo que sea necesario sincronizar, y no más grande.