0

In meinem Projekt muss ich eine Klasse X verwenden, die viele Methoden bietet, aber das Dokument erwähnt nicht, ob diese Methoden Thread-sicher sind, und ich habe nicht den Quellcode entweder.Öffentlicher finaler Mutex für Java-Thread-Sicherheit

So habe ich X in einer anderen Klasse mit einem Mutex eingekapselt:

public class MyX { 
    private X instance; 
    public final Object mutex = new Object(); 
    public MyX() { 
     this.instance = new X(); 
    } 
    public X getMethods() { 
     return this.instance; 
    } 
} 

Wenn ich Methoden der X anrufen müssen, verwende ich einen synchronized Block:

MyX myX = new MyX(); 
synchronized (myX.mutex) { 
    X methods = myX.getMethods(); 
    methods.method1(); 
    methods.method2(); 
    ... ... ... 
} 

Oder ich vielleicht kann direkt auf eine Instanz der Klasse X:

X instance = new X(); 
synchronized(instance) { 
    instance.method1(); 
    instance.method2(); 
    ... ... ... 
} 
synchronisieren

Ich würde gerne wissen, welcher Weg besser ist, und gibt es ein besseres Design für dieses Problem.

Danke.

Antwort

3

Wenn Sie zwischen zwei Methoden derselben Klasse synchronisieren möchten, sollten Sie sich für mutex entscheiden.

Freilegen von Mutex als öffentliche Variable ist gegen objektorientierte Prinzipien und daher nicht zu empfehlen.

Wenn Sie außerhalb der Klasse arbeiten, ist die Erfassung des Objekts, an dem Sie gerade arbeiten, die beste Option, würde ich sagen.

X instance = new X(); 
synchronized(instance) { 
instance.method1(); 
instance.method2(); 
... ... ... 
} 
+0

Vielen Dank @Anand Vaidya. In meinem Programm teilen sich mehrere Threads die gleiche Instanz der Klasse 'X'. Ich werde dann den zweiten Weg wählen. – vesontio

+0

Noch eine Frage, ist 'synchronized (instance)' äquivalent zu 'public synchronized void method1()'? – vesontio

+0

ja. Wenn ein Thread eine synchronisierte Methode für ein Objekt ausführt, werden alle anderen Threads aufgerufen, die synchronisierte Methoden für denselben Objektblock aufrufen (Ausführung aussetzen), bis der erste Thread mit dem Objekt ausgeführt wird. http://stackoverflow.com/questions/9196723/learning-java-use-of-synchronized-keyword –