2009-12-14 7 views
16

den folgenden Code vor:Synchronisation auf „Referenz“ oder auf Instanz

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

Ist Aufruf an Methoden dec() und inc() THREAD? Zum einen werden diese Methoden an zwei verschiedenen Instanzen _ lockRef1 und _ lockRef2 synchronisiert. Auf der anderen Seite sind diese Instanzen „Punkt“ auf dem gleichen Objekt LOCK ...

Antwort

16

Sie sind nicht „auf zwei verschiedenen Instanzen synchronisiert“ - nur weil man zwei verschiedene Variablen verwenden dort nicht bedeuten, zwei verschiedene Instanzen. Sie haben mehrere Variablen, von denen jede den gleichen Wert hat - ein Verweis auf die einzelne Instanz von java.lang.Object.

Also ja, das ist Thread-sicher. Natürlich sollte man keinen solchen Code in Bezug auf die Lesbarkeit schreiben, aber vorausgesetzt, man versucht nur zu verstehen, was passiert, ist es in Ordnung.

+0

Die Frage ist mit 'Java' markiert, also denke ich, dass dies 'java.lang.Object' wäre. – Yuval

+0

@Yuval: Doh - habe das nicht bemerkt. Danke, behoben :) –

+0

Got it! Vielen Dank! Eigentlich habe ich eine emun statt "private statische final Object", aber es scheint, die Idee ist die gleiche. – Lopotun

Verwandte Themen