Dúvida em StringBuffer  XML
Índice dos Fóruns » Certificação Java
Autor Mensagem
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
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....
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
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

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!
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
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

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").


[WWW]
 
Índice dos Fóruns » Certificação Java
Ir para:   
Powered by JForum 2.1.8 © JForum Team