Question

Je crois que je suis confronté à une situation de concurrence critique dans mon interface graphique JAVA.

Certaines méthodes permettent de créer une "méthode anonyme". dans une classe anonyme comme ceci:

synchronized foo()
{
     someMethod(new TimerTask()
     {
          public synchronized run()
          {

               //stuff

          }
     };
}

QUESTION: cette méthode d'exécution est-elle synchronisée sur l'objet TimerTask ou la classe dans laquelle foo est?

QUESTION2: si je me suis débarrassé du message "synchronisé" dans la déclaration run (), et disposer à la place d'un bloc synchronisé (this) {} à l'intérieur du corps run (), "ceci" serait " fait référence à l'objet TimerTask ou à l'objet qui est une instance de la méthode qui contient foo ()?

S'il vous plaît, aidez-moi ici.

Merci, jbu

Était-ce utile?

La solution

La méthode run est synchronisée sur la TimerTask elle-même. Les méthodes d'instance synchronisées sont toujours toujours synchronisé sur cet objet. (Les méthodes de classe sont synchronisées sur l'objet Class .)

Si vous souhaitez effectuer une synchronisation sur l'objet dont foo est membre, vous devez qualifie le ce mot clé. Supposons que foo () est membre du < code> Bar , dans la méthode run () de TimerTask , vous pouvez utiliser

public void run() {
  synchronized(Bar.this) {
    ...
  }
}

Autres conseils

Je suis à peu près sûr de ces réponses, mais je ne parviens pas à trouver une bonne source atm.

La première question:
synchronized se verrouille sur la TimerTask.

Deuxième question:
cela fait référence à la TimerTask; si vous vouliez verrouiller l’objet contenant, vous utiliseriez MyContainingObject.this

Un seul thread peut avoir accès aux éléments swing. C'est AWT-EventQueue-0. Vous devez être conscient de cela. Si d’autres de vos fils se noient ou changent d’éléments, il est très probable que l’interface graphique plante. Pour exécuter votre interface graphique avec ce fil:

  try {
            SwingUtilities.invokeAndWait(new Runnable(){
                public void run(){
                    Swing_Prozor1 prozor = new Swing_Prozor1();
                }
            });
        } catch (InterruptedException e) {
            //namjerno zanemareno
        } catch (InvocationTargetException e) {
            //namjerno zanemareno
        }

et si vous avez des classes anonymus, cela vous donnera l'instance de la classe dans laquelle vous vous trouvez, donc si vous écrivez dans la classe anonymus ceci. est un exemple de cette classe. Pour obtenir une instance de classe que vous souhaitez écrire:

  

ClassName.this

hmm, le code ci-dessus que vous avez écrit me le dit. Vous avez prétecté une partie du code deux fois. Lorsque vous écrivez une méthode syncronized, cela signifie qu'un seul thread peut accéder à cette méthode à la fois. Les autres threads attendent que la méthode synchronisée soit déverrouillée.

Si vous cherchez à synchroniser les fonctions foo () et run (), vous pouvez créer un objet de verrouillage explicite tel que

.

final Object lock = new Object ();

puis synchronisez dessus.

foo() {
    synchronized(lock) {
       someMethod(new TimerTask() {
          public void run() {
              synchronized(lock)  {
                     //stuff
              }
          }
      }
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top