2009-12-14 15 views
16

Si consideri il seguente codice:Sincronizzazione su "di riferimento" o su istanza

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++; 
    } 
    } 
} 

È chiamata a metodi dec() e inc() threadsafe? Da un lato questi metodi sono sincronizzati su due diverse istanze _ lockRef1 e _ lockRef2. D'altra parte, queste istanze "punto" sullo stesso oggetto LOCK ...

risposta

16

Non sono "sincronizzati su due istanze diverse" - solo perché si utilizzano due diversi variabili non significa che ci sono due diverse istanze . Hai diverse variabili ognuna delle quali avrà lo stesso valore: un riferimento alla singola istanza di java.lang.Object.

Quindi sì, questo è thread-safe. Ovviamente non dovresti scrivere codice come questo in termini di leggibilità, ma partendo dal presupposto che stai solo cercando di capire cosa succede, va bene.

+0

La domanda è contrassegnata come "Java", quindi penso che questo sarebbe 'java.lang.Object'. – Yuval

+0

@Yuval: Doh - non lo ha notato. Grazie, risolto :) –

+0

Grazie! In realtà, ho un emun invece di "oggetto statico finale privato", ma sembra che l'idea sia la stessa. – Lopotun

Problemi correlati