2009-12-14 11 views
16

Considere el siguiente código:Sincronización en la "referencia" o en la instancia

public class Foo { 
    private static final Object LOCK = new Object(); 
    private Object _lockRef1 = LOCK; 
    private Object _lockRef2 = LOCK; 
    private int _indx = 0; 

    public void dec() { 
    synchronized(_lockRef1) { 
     _indx--; 
    } 
    } 

    public void inc() { 
    synchronized(_lockRef2) { 
     _indx++; 
    } 
    } 
} 

es llamar a los métodos dec() y inc() multi-hilo? Por un lado, estos métodos están sincronizados en dos instancias diferentes _ lockRef1 y _ lockRef2. Por otra parte, estas instancias "punto" en el mismo objeto LOCK ...

Respuesta

16

No están "sincronizados en dos instancias diferentes" - sólo porque utiliza dos variables de diferentes no quiere decir que hay dos diferentes instancias. Tiene varias variables, cada una de las cuales tendrá el mismo valor: una referencia a la única instancia de java.lang.Object.

Así que sí, esto es seguro para subprocesos. Por supuesto, no debería escribir código como este en términos de legibilidad, pero suponiendo que solo está tratando de entender lo que sucede, está bien.

+0

La pregunta está etiquetada como 'Java', por lo que creo que sería 'java.lang.Object'. – Yuval

+0

@Yuval: Doh - no vio eso. Gracias, reparado :) –

+0

¡Lo tengo! ¡Gracias! En realidad, tengo un emun en lugar de un "Objeto final estático privado", pero parece que la idea es la misma. – Lopotun

Cuestiones relacionadas