java anonyme Klassen und Synchronisation und „this“
-
03-07-2019 - |
Frage
ich mit einer Race-Bedingung zu tun habe, glaube ich, in meinem JAVA GUI.
Ich habe einige Methoden, die eine „anonyme Methode“ innerhalb einer anonymen Klasse wie folgt zu erstellen:
synchronized foo()
{
someMethod(new TimerTask()
{
public synchronized run()
{
//stuff
}
};
}
Frage: ist, dass run-Methode auf dem Timertask Objekt oder die Klasse synchronisiert, dass foo in ist?
question2: Wenn ich von der „synchronisiert“ in der run () Erklärung losgeworden, und haben stattdessen eine synchronisierte (diese) {} Block innerhalb der run () Körper, würde „dieses“ beziehen sich auf die Timertask Objekt oder das Objekt, das ein Beispiel des Verfahrens ist es, die foo ()?
enthältBitte helfen Sie mir hier.
Danke, JBU
Lösung
Die run
Methode basiert auf dem TimerTask
selbst synchronisiert. Synchronisierte Instanzmethoden sind immer auf this
Objekt synchronisiert. (Klassenmethoden sind auf dem Class
Objekt synchronisiert.)
Wenn Sie auf das Objekt synchronisiert werden soll, von denen foo
Mitglied ist, müssen Sie ein href <= "http://java.sun.com/docs/books/jls/third_edition/html/expressions.html# 15.8.4" rel = "noreferrer"> qualifiziert das this
Stichwort. Angenommen foo()
ist ein Mitglied der Bar
Klasse, in der run()
Methode von TimerTask
, können Sie
public void run() {
synchronized(Bar.this) {
...
}
}
Andere Tipps
Ich bin mir ziemlich sicher, dass diese Antworten, aber ich kann eine gute Quelle atm nicht ausgraben.
Die erste Frage:
synchronisiert wird auf der Timertask sperrt.
Zweite Frage:
Dies bezieht sich auf die Timertask; wenn Sie auf dem enthaltende Objekt sperren wollen Sie MyContainingObject.this verwenden würden
Es gibt nur einen Thread, die Elemente Zugang zu schwingen haben. Das ist AWT-Eventqueue-0. Sie müssen sich dessen bewusst sein. Wenn andere Ihrer Threads drowing oder changeing Elemente gibt es sehr gute Wahrscheinlichkeit, dass gui abstürzen. Um Ihre gui mit diesem Thread ausgeführt:
try { SwingUtilities.invokeAndWait(new Runnable(){ public void run(){ Swing_Prozor1 prozor = new Swing_Prozor1(); } }); } catch (InterruptedException e) { //namjerno zanemareno } catch (InvocationTargetException e) { //namjerno zanemareno }
und wenn Sie anonymus Klassen haben dies wird Ihnen Instanz der Klasse, in der Sie sind, also wenn Sie diese in anonymus Klasse writteing. ist Instanz dieser Klasse. Um Instanz der Klasse wollen Sie schreiben:
ClassName.this
hmm das obige Code Sie sagt mir, schrieb diese. Sie pretected zweimal den Codeteil. Wenn Sie synchronisierte Methode schreiben bedeutet dies, dass nur ein Thread diese Methode zu einem Zeitpunkt zugreifen kann. Andere Threads warten, während synchronisierte Methode entriegelt wird.
Wenn Sie zum Synchronisieren der foo suchen () und run (), dann können Sie ein explizites Sperrobjekt wie
erstellenletzte Objektsperre = new Object ();
und dann auf sie synchronisieren.
foo() {
synchronized(lock) {
someMethod(new TimerTask() {
public void run() {
synchronized(lock) {
//stuff
}
}
}