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ält

Bitte helfen Sie mir hier.

Danke, JBU

War es hilfreich?

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

erstellen

letzte Objektsperre = new Object ();

und dann auf sie synchronisieren.

foo() {
    synchronized(lock) {
       someMethod(new TimerTask() {
          public void run() {
              synchronized(lock)  {
                     //stuff
              }
          }
      }
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top