| Autor |
Mensagem |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 14/01/2010 20:06:06
|
TiagoTC
JavaTeenager
Membro desde: 09/02/2008 01:12:58
Mensagens: 189
Offline
|
Which statements is true?
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?
Obrigado.
|
Pérola: "Nunca coloque seu celular em um forno de microondas, pois isso faz com que a bateria exploda" - Manuais de telefones celulares |
|
|
 |
|
|
![[Post New]](/templates/default/images/icon_minipost_new.gif) 14/01/2010 20:10:02
|
vmsb11
Java Ninja
Membro desde: 25/08/2008 12:35:00
Mensagens: 251
Offline
|
a alternativa A está incorreta porq StringBuffer é Thread-Safe, então o código é Thread-Safe, pode haver impasse sim....
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 14/01/2010 20:46:27
|
TiagoTC
JavaTeenager
Membro desde: 09/02/2008 01:12:58
Mensagens: 189
Offline
|
vmsb11 wrote:a alternativa A está incorreta porq StringBuffer é Thread-Safe, então o código é Thread-Safe, pode haver impasse sim....
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.
|
Pérola: "Nunca coloque seu celular em um forno de microondas, pois isso faz com que a bateria exploda" - Manuais de telefones celulares |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 14/01/2010 20:50:55
|
brrodo
JavaTeenager
Membro desde: 07/02/2009 23:31:16
Mensagens: 173
Offline
|
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.
This message was edited 1 time. Last update was at 14/01/2010 20:55:58
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 15/01/2010 14:12:33
|
feliperoliveira
Entusiasta Java
Membro desde: 14/10/2009 08:15:50
Mensagens: 19
Localização: Blumenau
Offline
|
Uma dúvida?
A alternativa "A" estaria correta por que o método toString não é thead-safe e o método utiliza diretamente a variavel name, e esta, a variavel name, poderia ser alterada por outro código tal como
?
|
Porque Deus amou o mundo de tal maneira que deu seu Unico filho para nos Salvar! |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 15/01/2010 14:16:30
|
TiagoTC
JavaTeenager
Membro desde: 09/02/2008 01:12:58
Mensagens: 189
Offline
|
feliperoliveira wrote:Uma dúvida?
A alternativa "A" estaria correta por que o método toString não é thead-safe e o método 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...
|
Pérola: "Nunca coloque seu celular em um forno de microondas, pois isso faz com que a bateria exploda" - Manuais de telefones celulares |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 15/01/2010 14:23:01
|
vmsb11
Java Ninja
Membro desde: 25/08/2008 12:35:00
Mensagens: 251
Offline
|
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:
ai se uma thread estiver la nesse trecho e outra thread estiver tentando chamar toString então o trecho não executará até que o bloco synchronized termine de ser executado ou que vc emita um this.name.wait();
This message was edited 1 time. Last update was at 15/01/2010 14:36:16
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 15/01/2010 14:35:20
|
thingol
Moderador
Membro desde: 29/07/2004 16:10:13
Mensagens: 17543
Offline
|
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").
|
|
|
|
 |
|
|