2011-11-01 11 views
44

Tengo una Collections.synchronizedList de WeakReference, _components;En Java, el valor de retorno dentro del bloque sincronizado parece un mal estilo. ¿Realmente importa?

escribí algo como lo siguiente, esperando que el compilador para quejarse:

public boolean addComponent2(Component e) { 
    synchronized (_components) { 
     return _components.add(new WeakReference<Component>(e)); 
    }   
} 

Pero el compilador es perfectamente satisfecho. Tenga en cuenta que List.add() devuelve TRUE. Entonces, cualquier salida de un bloque sincronizado libera el bloqueo, ¿pero esto no es extraño? Es como un "agujero" en el bloque, similar al uso de retorno en un bucle.

¿Sería feliz manteniendo un código como este?

Respuesta

52

Está absolutamente bien, ya que regresa de un bucle, o de un bloque try que tiene un bloque finally apropiado. Solo necesitas ser consciente de la semántica, momento en el que tiene perfecto sentido.

Es ciertamente código más simple que la introducción de una variable local para el bien de ella:

// Ick - method body is now more complicated, with no benefit 
public boolean addComponent2(Component e) { 
    boolean ret; 
    synchronized (_components) { 
     ret = _components.add(new WeakReference<Component>(e)); 
    } 
    return ret; 
} 
+1

Si bien por lo general regreso desde el interior del bloque también (en realidad, yo no me encuentro utilizando bloques de sincronización primitivos ya mucho de todos modos , pero aún así) puede haber algún beneficio al hacer esto desde el principio. Si solo tiene el bloque de sincronización, y más tarde se debe agregar un código adicional, pero ese código no requiere sincronización, entonces ya lo tiene descompuesto. Si no se desglosa, los desarrolladores futuros de prisa pueden agregar el código adicional dentro del bloque de sincronización, ya que es más fácil, lo que puede atar el monitor innecesariamente. Así que todavía devolvería el formulario dentro, pero hay algunos beneficios menores para el futuro. – corsiKa

+3

@corsiKa: solo hay beneficios para el futuro * si * ese cambio es requerido. Si no se requiere, entonces * leer * el código es un poco más difícil todo el tiempo, IMO. –

38

No hay nada de malo en regresar dentro de un bloque synchronized. El bloqueo se lanzará correctamente.

Cuestiones relacionadas