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

  1. public class TestSeven extends Thread {
  2. private static int x;
  3. public synchronized void doThings() {
  4. int current = x;
  5. current++;
  6. x = current;
  7. }
  8. public void run() {
  9. doThings();
  10. }
    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?

Desde já agradeço pela atenção.

5 Respostas

eberson_oliveira

Bom dia,

Então…

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! :smiley:
Gustavo e Eberson mto obrigado pela ajuda !
e vamo que vamo estudando…

Criado 4 de agosto de 2010
Ultima resposta 16 de ago. de 2010
Respostas 5
Participantes 3