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.
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
Noch eine Frage, ist 'synchronized (instance)' äquivalent zu 'public synchronized void method1()'? – vesontio
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 –