Ola a todos,
Estou com uma dúvida a respeito do uso de classes unsynchronized em ambientes multithread.
Por exemplo:
As classes StringBuffer e StringBuilder.
StringBuffer é synchronized, e portanto thread-save. Por causa disso a recomendação é de que em ambientes multithread como um container web seja usado StringBuffer ao invés de StringBuilder.
A questão é: Isso se aplicaria a qualquer coisa que rode dentro do servidor web, ou apenas a códigos compartilhados?
Por exemplo no seguinte Servlet:
public class TesteServlet extends HttpServlet {
private StringBuffer compartilhado = new StringBuffer();
public void doGet(HttpServletRequest solicitacao, HttpServletResponse resposta) throws ServletException, IOException {
StringBuilder local = new StringBuilder();
}
}
Neste exemplo, o atributo “compartilhado” com certeza têm de ser StringBuffer, já que ele será compartilhado entre as várias threads que acessam este servlet, e portanto têm de ser thread-safe.
Mas e a variável “local”?
A princípio, cada thread teria sua própria instância dessa variável e portanto ela poderia ser uma StringBuilder para evitar o overhead de lidar com sincronização, correto?
E no caso dos ManagedBeans do JSF? Se aplicaria a mesma lógica?
Desculpem-me se a pergunta foi simplória, mas essa é uma questão que pode afetar a performance dos sistemas web, por isso julgo-a bem relevante.