2009-12-14 10 views
16

Rozważmy następujący kod:Synchronizacja na "odniesienie" lub na przykład

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

to zadzwonić do metod dec() i inc() THREADSAFE? Z jednej strony metody te są zsynchronizowane w dwóch różnych instancjach _ lockRef1 i _ lockRef2. Z drugiej strony, te przypadki „punkt” na tym samym obiekcie LOCK ...

Odpowiedz

16

Oni nie „zsynchronizowane na dwóch różnych przypadkach” - tylko dlatego, że korzystać z dwóch różnych zmienne nie znaczy, że są dwa różne instancje instancji. Masz kilka zmiennych, z których każda ma tę samą wartość - odniesienie do pojedynczego wystąpienia java.lang.Object.

Tak, to jest bezpieczne dla wątków. Oczywiście nie powinieneś pisać tego kodu pod względem czytelności, ale zakładając, że po prostu próbujesz zrozumieć, co się dzieje, to jest w porządku.

+0

Pytanie jest oznaczone jako "Java", więc myślę, że byłby to "java.lang.Object". – Yuval

+0

@Yuval: Doh - nie zauważyłem tego. Dzięki, naprawiono :) –

+0

Got it! Dzięki! Właściwie mam emun zamiast "prywatnego statycznego obiektu końcowego", ale wydaje się, że idea jest taka sama. – Lopotun

Powiązane problemy