Java Anonymous Classes and Syncronization e "This"
-
03-07-2019 - |
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
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
}
}
}