2012-08-23 15 views
5

Escribo una aplicación web en Java 1.6 y la ejecuto en tomcat. Si bien no estoy haciendo ningún enhebrado explícito, me pregunto qué está sucediendo entre bastidores con Spring y Tomcat. ¿Me encontraría con algún problema al utilizar StringBuilder en lugar de StringBuffer?¿Debo usar StringBuilder o StringBuffer para webapps?

+0

posible duplicado de [StringBuilder y StringBuffer en Java] (http://stackoverflow.com/questions/355089/stringbuilder-and-stringbuffer-in-java) – kosa

+0

@thinksteep Esta pregunta se debe centrar en qué tipo de subprocesos sucede detrás de escena en webapps y cómo eso afecta la construcción de cadenas. –

+4

Probablemente no es un duplicado. Esto parece ser más una pregunta acerca de enhebrar en Tomcat que las clases de StringBuilder/StringBuffer. –

Respuesta

10

Si está utilizando una variable local, puede usar StringBuilder de manera segura. Cada hilo tendrá su propia instancia.

+4

+1. Y si * estás * compartiendo cadenas entre hilos (por ejemplo, usando campos estáticos), entonces probablemente deberías usar 'String' en lugar de' StringBuilder' * o * 'StringBuffer'. – ruakh

+3

Para enfatizar el punto de ruakh: pasar datos inmutables entre hilos es el enfoque seguro. –

0

si el código está en un servlet (doGet/doPost), entonces varias solicitudes harán que la instancia del servlet sea de subprocesos múltiples. Si el código está en un bean de primavera, dependerá de si configuró el bean como singleton o prototipo.

+0

Para ser más precisos, debe decir: que la instancia de servlet puede ser compartida por varios hilos que sirven a clientes diferentes. – Razvan

+0

esa es una mejor manera de decir eso. :) –

1

Por lo general, los componentes de Java EE no son seguros para subprocesos de forma predeterminada, por lo que a menos que sincronice los bloques de código donde usa el StringBuilder, experimentará condiciones de carrera. Por lo tanto, debe tener cuidado de la sincronización o usar StringBuffer.

Por supuesto, como ya se mencionó si el StringBuilder es una variable local, no tiene que preocuparse por eso.

0

Utilice StringBuilder ya que su constructor es una variable local en doPost o doGet o de lo contrario. Es cierto que los subprocesos de varios servidores usan la misma instancia de servlet, pero el hecho de que el generador sea una variable local, ¡no hay motivo para preocuparse! Si tu constructor era miembro de tu clase de servlet, seguro que obtendrías problemas de seguridad de subprocesos. No es tu caso, supongo.

0

El Java doc dice con respecto java.lang.StringBuffer:

Siempre que se produzca una operación que implica una secuencia de origen (como anexar o inserción de una secuencia de origen) esta clase sincroniza sólo en el búfer de cadena realizando la operación, no en la fuente.

Esto significa que sus operaciones en su StringBuffer serán seguras incluso si se encuentra en un entorno de múltiples hilos [como la aplicación web]. La seguridad de su instancia de StringBuffer como tal se rige por el alcance de la variable.