Duvida questão TestKiller (synchronized + metodo statico)[RESOLVIDO]
5 respostas
IMPERIO
Olá pessoal, estou com uma duvida em uma questão do Teste Killer será que vocês podem me ajudar…a pergunta é essa
public class TestSeven extends Thread {
private static int x;
public synchronized void doThings() {
int current = x;
current++;
x = current;
}
public void run() {
doThings();
}
11.}
Which statement is true?
A. Compilation fails.
B. An exception is thrown at runtime.
C. Synchronizing the run() method would make the class thread-safe.
D. The data in variable “x” are protected from concurrent access problems.
E. Declaring the doThings() method as static would make the class thread-safe.
F. Wrapping the statements within doThings() in a synchronized(new Object()) { }
block would make the class thread-safe.
A resposta é a E.
Agora minha duvida é a seguinte, pra mim a resposta correta seria a D, a variavel X estaria protegida de problemas de acesso simultâneo.
Pq colocando o metodo como statico deixaria a classe thread-safe?
Quando sincronizamos um método não estático, ao acessá-lo obtemos o “lock” para a instância que está invocando aquele métdodo (this) ao sincronizarmos um método estático o lock obtido quando acessado se refere a classe, pois o método não está associado a nenhuma instãncia.
A resposta D não está correta, pois a variável X pode ser acessada por múltiplas threads, o fato de haver o sincronized no método doThings não refresca em nada, pois o “lock” será obtido para a instância, e o atributo x pertence à classe.
Ao adicionarmos static no método doThings garantimos a proteção, pois ao acessá-lo será obtido o lock para à classe protegendo “por tabela” o atributo estático da classe.
Não sei se fui claro o suficiente, mas essa questão está bem clara no livro da certificação, se tiver um dê uma olhada com calma que será fácil entender.
Espero ter ajudado,
[]
Éberson
IMPERIO
Olá… eberson_oliveira
Entaum estava suspeitando disto mesmo… que a variavel X poderia ser acessada por vários caras(threads diferentes) e desta forma não adianta o metodo doThings ser sincronizado, pois o sincronismo é do objeto e a variavel X é statica da classe.
O que não sabia e naum entendia mto bem era esse lance da diferença em sincronizar algo statico.
Pelo que entendi quando sincronizo algo statico no caso o metodo doThing, pego o lock da classe e desta forma garanto que a variavel X será utilizada apenas por um thread. Garantindo assim o sincronismo do processo.
Estou certo ?
Mto obrigado pela Explicação.
Gustavo_Santos
Métodos sincronizados bloqueiam a instância this. Threads que chamam esse métodos só
bloquearão uns aos outros se forem chamados usando-se a mesma instância, claro,
um deles bloqueia a instância this, e quando ao outro espera, terá que esperar.
Sendo assim, o campo estático está ai vulnerável a qualquer outro thread.
Ao marcar o método com static, você garânte que quaisquer threads que
tentem acessar esses dados serão impedidos de ter acesso simultânte, porque esses threads
terão que objeter o bloqueio do objeto Class.
Espero ter ajudado…
Gustavo_Santos
" Pelo que entendi quando sincronizo algo statico no caso o metodo doThing, pego o lock da classe e desta forma garanto que a variavel X será utilizada apenas por um thread. Garantindo assim o sincronismo do processo. "
É, acho que entendeu !
IMPERIO
Opa!
Gustavo e Eberson mto obrigado pela ajuda !
e vamo que vamo estudando…