Pergunta

Estou lidando com uma condição de corrida, acredito, na minha GUI Java.

Eu tenho alguns métodos que criam um "método anônimo" dentro de uma aula anônima como esta:

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

               //stuff

          }
     };
}

Pergunta: Esse método de execução é sincronizado no objeto Timertosk ou na classe em que o foo está?

Question2: Se eu me livrei da declaração "sincronizada" na declaração de run () e, em vez disso, tiver um bloco sincronizado (this) {} dentro do corpo run (), "isso" se referiria ao objeto Timertosk ou ao objeto que que É uma instância do método que contém foo ()?

Por favor me ajude aqui.

Obrigado, JBU

Foi útil?

Solução

o run o método é sincronizado no TimerTask em si. Sincronizado Métodos de instância são sempre sincronizado em this objeto. (Os métodos de classe são sincronizados no Class objeto.)

Se você deseja sincronizar o objeto de qual foo é um membro, você precisa qualifique o this palavra -chave. Suponha foo() é um membro do Bar classe, dentro do run() método de TimerTask, você pode usar

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

Outras dicas

Tenho certeza dessas respostas, mas não consigo desenterrar um bom caixa eletrônico de fonte.

A primeira pergunta:
O sincronizado será bloqueado no TimerTask.

Segunda questão:
Isso se refere ao TimerTask; Se você quisesse trancar o objeto que contém você usaria myconteningObject.

Existe apenas um thread que pode ter acesso a elementos balançados. Isso é owt-veio de veio-0. Você precisa estar ciente disso. Se outros seus threads estiverem com elementos de droga ou mudança, há uma probabilidade muito boa de a GUI travar. Para executar sua GUI com este tópico:

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

E se você tiver aulas do Anonymus, isso lhe dará uma instância de classe em que você está; portanto, se você estiver escritos na classe Anonymus. é a instância dessa classe. Para obter a instância da classe que você deseja escrever:

ClassName.This

Hmm, este código acima que você escreveu me diz isso. Você precedeu parte do código duas vezes. Quando você escreve o método sincronizado, significa que apenas um thread pode acessar esse método ao mesmo tempo. Outros threads esperam enquanto o método sincronizado é desbloqueado.

Se você está procurando sincronizar o foo () e run (), poderá criar um objeto de bloqueio explícito como

Final Object Lock = new Object ();

e então sincronize nele.

foo() {
    synchronized(lock) {
       someMethod(new TimerTask() {
          public void run() {
              synchronized(lock)  {
                     //stuff
              }
          }
      }
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top