Pregunta

Estoy lidiando con una condición de carrera, creo, en mi GUI JAVA.

Tengo algunos métodos que crean un " método anónimo " dentro de una clase anónima como esta:

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

               //stuff

          }
     };
}

PREGUNTA: ¿ese método de ejecución está sincronizado en el objeto TimerTask o la clase en la que se encuentra foo?

PREGUNTA2: si me deshago de la sincronización sincronizada en la declaración run (), y en su lugar tiene un bloque sincronizado (this) {} dentro del cuerpo run (), sería " this " consulte el objeto TimerTask o el objeto que es una instancia del método que contiene foo ()?

Por favor, ayúdame aquí.

Gracias, jbu

¿Fue útil?

Solución

El método run se sincroniza en el TimerTask . Los métodos de instancia sincronizados siempre son siempre sincronizado en este objeto. (Los métodos de clase se sincronizan en el objeto Class ).

Si desea sincronizar el objeto del cual foo es miembro, debe califica la palabra clave this . Supongamos que foo () es miembro de < code> Bar , dentro del método run () de TimerTask , puede usar

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

Otros consejos

Estoy bastante seguro de estas respuestas, pero no puedo desenterrar un buen cajero automático.

La primera pregunta:
sincronizado se bloqueará en TimerTask.

Segunda pregunta:
esto se refiere a TimerTask; si quisieras bloquear el objeto que contiene usarías MyContainingObject.this

Solo hay un hilo que puede tener acceso a elementos oscilantes. Eso es AWT-EventQueue-0. Necesitas estar al tanto de esto. Si otros subprocesos se están ahogando o cambiando elementos, existe una muy buena probabilidad de que la interfaz gráfica de usuario se bloquee. Para ejecutar su interfaz gráfica de usuario con este hilo:

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

y si tienes clases de anonymus, esto te dará una instancia de la clase en la que estás, así que si estás escribiendo en anonymus class esto. es una instancia de esa clase. Para obtener la instancia de la clase que desea escribir:

  

ClassName.this

hmm este código anterior que escribiste me dice esto. Fingiste parte del código dos veces. Cuando escribe un método sincronizado, significa que solo un hilo puede acceder a este método a la vez. Otros hilos esperan mientras el método sincronizado está desbloqueado.

Si está buscando sincronizar foo () y run (), entonces puede crear un objeto de bloqueo explícito como

final Object lock = new Object ();

y luego sincronizar en él.

foo() {
    synchronized(lock) {
       someMethod(new TimerTask() {
          public void run() {
              synchronized(lock)  {
                     //stuff
              }
          }
      }
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top