Em um aplicativo Web de produção, meus colegas programadores usavam o StringBuffer em qualquer lugar. Agora estou cuidando do desenvolvimento e das correções de aplicativos. Depois de ler StringBuilder e StringBuffer , decidi substituir todo o código StringBuffer pelo StringBuilder porque não precisamos de segurança de thread em nossos beans de dados.
Por exemplo: (Em cada bean de dados, posso ver o uso de StringBuffer)
@Override
public String toString() {
StringBuffer sb = new StringBuffer();// replace it from StringBuilder
sb.append(" ABCD : ").append(abcd);
sb.append(", EFGH : ").append(efgh);
sb.append(", IJKL : ").append(ijkl);
}
Criamos um bean de dados separado para cada sessão / solicitação. Uma sessão é usada por um único usuário que nenhum outro usuário pode acessá-la.
Devo considerar outros pontos antes de migrar?
Se houver um único thread (nenhum thread em espera / nenhum novo thread procurará o bloqueio de objeto), ele será executado igualmente com StringBuffer ou StringBuilder. Sei que, no caso de StringBuffer, leva tempo para bloquear o objeto, mas quero saber se há alguma diferença de desempenho entre eles, exceto a retenção / liberação do bloqueio de objeto.
StringBuffer
. Nunca vi código assim, mas tenho quase certeza de que é um design ruim do ponto de vista de multithreading. Como acho que a sincronização do encadeamento ao longo da StringBuffer
interface é uma péssima idéia, acho que essa classe não deveria existir e sempre se deve usar StringBuilder
. Como outros já mencionados, StringBuffer
existe por razões históricas.
sb
como uma variável local, como no seu exemplo, a segurança da thread não importa. Mesmo que mil threads entrassem simultaneamente no método, cada um teria sua própria pilha de chamadas com suas próprias variáveis locais. Os StringBuilders nunca interfeririam entre si.