Which three changes should be made to adapt this class to be used
safely by multiple threads? (Choose three.)
A. declare reset() using the synchronized keyword
B. declare getName() using the synchronized keyword
C. declare getCount() using the synchronized keyword
D. declare the constructor using the synchronized keyword
E. declare increment() using the synchronized keyword
Resposta correta: ACE.
Não entendi o porque que as alternativas B e D não precisam do synchronized.
Olá
As alternativas B e D dizem respeito ao atributo name, declarado como final - portanto não é possível modificá-lo - e com tipo String, cujos objetos são imutáveis. Ora, se o valor do atributo só pode ser lido, mas não modificado, não há porque se preocupar em sincronizá-lo.
antonioedirane
tnaires:
Olá
As alternativas B e D dizem respeito ao atributo name, declarado como final - portanto não é possível modificá-lo - e com tipo String, cujos objetos são imutáveis. Ora, se o valor do atributo só pode ser lido, mas não modificado, não há porque se preocupar em sincronizá-lo.
Valeu tnaires.
Não tinha me atentado que era final. Fiquei só olhando para a thread.
Muito Obrigado.
Vini_Fernandes
Cara, a palavra reservada synchronized é utilizada para sincronizar métodos e blocos de código, portanto é um erro de síntaxe sincronizar um construtor, entao acabamos de responder uma das dúvidas. Um dos propósitos de sincronizar o método é proteger o código do método que será realizado, por exemplo, voce nao quer que duas pessoas acessando uma mesma conta corrente saquem valores ao mesmo tempo, pois dessa maneira eles poderao sacar valores que nao deveriam, consequentemente, teriamos como resultado um saldo devedor. Assim, deveremos implementar algo parecido com isso:
Veja que o metodo getSaldo() nao esta sincronizado, pois, independente da ordem em as theads (dois clientes distintos) chamarem o metodo, não vai mudar em o estado da Conta Corrente! A unica coisa que eles fazem eh receber o valor do saldo da conta e isso nao importa se foi feito pelo cliente A ou cliente B.
Espero ter ajudado
tnaires
Mas lembre-se que não é só o fato de ser final, pois se o tipo do objeto fosse mutável - java.util.Date, por exemplo - você poderia ainda modificar seu conteúdo e o atributo seria passível de sincronização.
deyvid
Ok, muito bom. Mas não entendi por que C ( public int getCount() { return count; } ) precisa se sincronizado visto que não estamos lidando com mudança de valores neste caso específico
tnaires
Porque no momento em que uma thread está chamando o método getCount() e aguardando o término da sua execução, outra thread pode estar executando o método increment() ou reset(), que altera o valor da variável.
Agora talvez a questão tenha sido um pouco infeliz, pois acho que as instruções envolvidas nos métodos increment() e reset() são atômicas.
Lavieri
Porque no momento em que uma thread está chamando o método getCount() e aguardando o término da sua execução, outra thread pode estar executando o método increment() ou reset(), que altera o valor da variável.
Agora talvez a questão tenha sido um pouco infeliz, pois acho que as instruções envolvidas nos métodos increment() e reset() são atômicas.
eu concordo… não há razão para sincronizmo… é tudo atomico… se precisar synchronismo vai ser quando vc junta operações, essa questão é no minimo triste… mas pelo enuncionado, so sobram as 3 possibilidades indiciadas como certa mesmo… mas a questão é muito infeliz sim