a) This code is NOT thread-safe.
b) The programmer can replace StringBuffer with StringBuilder with no other changes.
c) This code will perform poorly. For better performancy, the code should be rewritten: return "<"+this.name+">";
d) This code will perform well and converting the code to use StringBuilder will not enhance the performance.
A resposta correta é a B, o que eu não contesto. Porém, porque a alternativa A também não é correta? Eu sei que a classe StringBuffer é thread-safe, mas,
durante os vários comandos, não poderia haver impasse caso alguém estivesse mexendo na variável "name"? O thread-safe da classe StringBuffer não é apenas nas operações internas de seus métodos?
a alternativa A está incorreta porq StringBuffer é Thread-Safe, então o código é Thread-Safe, pode haver impasse sim…
T
TiagoTC
Como assim vmsb11? Só porque os métodos
são thread-safe, não quer dizer que todo o bloco do método toString seja. E se o método inteiro não é thread-safe, então a alternativa A também é correta.
B
brrodo
Na verdade não é possível afirmar se o bloco de código citado é ou não é thread safe, portanto a alternativa A não é correta.
A classe StringBuffer só é thread safe em seus métodos internos. Isso não faz com que o código que a utiliza se torne thread safe.
F
feliperoliveira
Uma dúvida?
A alternativa “A” estaria correta por que o método toString não é thead-safe e o método buffer.append(this.name) utiliza diretamente a variavel name, e esta, a variavel name, poderia ser alterada por outro código tal como
minhaClasse.setName(novoNome)?
T
TiagoTC
[quote=feliperoliveira]Uma dúvida?
A alternativa “A” estaria correta por que o método toString não é thead-safe e o método buffer.append(this.name) utiliza diretamente a variavel name, e esta, a variavel name, poderia ser alterada por outro código tal como
Sim, é exatamente essa a minha dúvida! Por isso que eu acho que a alternativa A também é correta…
V
vmsb11
analizando o código depois, acho que a alternativa A está correta msm
porq vamos imaginar que em uma outra parte do código esteja algo como:
synchronized(this.name){}
ai se uma thread estiver la nesse trecho e outra thread estiver tentando chamar toString então o trecho buffer.append(this.name) não executará até que o bloco synchronized termine de ser executado ou que vc emita um this.name.wait();
T
thingol
Muitas vezes (mas não nas provas de verdade da Sun, que evitam propositadamente mexer neste vespeiro) há uma certa confusão entre o fato de uma classe, como a StringBuffer, ter seus métodos sincronizados (ou seja, o estado interno dela não fica incoerente se várias threads acessarem o mesmo objeto) e um determinado código que usa tal classe ser thread-safe.
O código a) é thread-safe, mas não porque a classe em si tenha seus métodos sincronizados.
É que, para cada thread que for chamar esse método, um novo objeto dessa classe é criado, que é ainda por cima não compartilhado por outras threads (já que é local ao método) e não há interferência de uma outra thread na execução desse método.
Mas se o código fosse algo como:
ele não seria thread-safe, apesar de a classe ter métodos sincronizados.
É que nesse caso a execução do método toString por diversas threads ao mesmo tempo irá interferir na execução. Pense um pouco e imagine uma forma de aparecer a seguinte string como resultado de toString: "<<bla>>" (onde this.name = "bla").