El uso de StringBuffer en múltiples hilos es casi inútil y en realidad casi nunca sucede.
Considérese el siguiente
Thread1: sb.append(key1).append("=").append(value1);
Thread2: sb.append(key2).append("=").append(value2);
se sincroniza cada append, pero un hilo puede inclinarse en cualquier punto lo que puede tener cualquiera de las siguientes combinaciones y más
key1=value1key2=value2
key1key2==value2value1
key2key1=value1=value2
key2=key1=value2value1
Esto puede evitarse por sincronizando toda la línea a la vez, pero esto derrota el punto de usar StringBuffer en lugar de StringBuilder.
Incluso si tiene una vista sincronizada correctamente, es más complicado que simplemente crear una copia local de hilo de toda la línea, p. StringBuilder y líneas de registro a la vez a una clase como un escritor.
Es mejor decir que StringBuffer es "thread safe" pero es muy fácil inventar escenarios donde dos hilos en disputa por el mismo buffer causan condiciones de carrera.Incluso si tiene la necesidad de compartir un búfer de cadena entre hilos, es muy probable que necesite imponer un control de nivel más alto que los métodos sincronizados que muestra. Por lo tanto, no puedo pensar en muchas razones para usar StringBuffer a menos que una biblioteca de terceros exija su uso o para fines heredados o de nicho. – locka
'StringBuilder' no es exactamente un reemplazo directo de 1: 1 para' StringBuffer'. Por ejemplo, el método 'appendReplacement' de' Matcher' requiere un 'StringBuffer' como primer argumento. –