Su pregunta se reduce a: está llamando a un método desde múltiples hilos en el el mismo objeto es seguro para subprocesos. Y la respuesta es: depende. Si su objeto (que sea servlet) no tiene estado o solo tiene final
campos, esto es completamente seguro para subprocesos. Las variables locales y los parámetros son locales para el hilo (residen en la pila, no en el montón).
También cada service()
llamadas recibe una instancia distinta de ServletRequest
y ServletResponse
. Sin embargo aquí es un ejemplo de servlet inseguro:
public class UnsafeServlet implements Servlet {
private int counter;
public void init(ServletConfig config) throws ServletException {
}
public void service(ServletRequest request, ServletResponse response)
++counter;
}
public void destroy() {
}
}
Desde múltiples hilos pueden acceder counter
variable, se tiene que ser asegurado de alguna manera: o bien mediante el uso de synchronized
(volatile
no es suficiente):
synchronized(this) {
++counter;
}
o AtomicInteger
:
private AtomicInteger counter = new AtomicInteger();
//...
counter.incrementAndGet();
En este caso particular, AtomicInteger
es mucho mejor SINC e está libre de bloqueos usando operaciones de la CPU CAS mientras que synchronized
es un mutex.
@ Tomasz.can puede publicar aquí un breve ejemplo por el cual puede justificar, digamos que tiene un servlet simple y con 2 buscadores diferentes está haciendo una solicitud y deliberadamente por un hilo cambia el valor. Esto es lo que quiero ver ... Gracias de antemano – user1508454
Gran hombre, ¿podrías publicar cómo protegerías el contador ahora, y sincronizado afectará el rendimiento? ¿Podrías explicar un poco sobre Atomic Integer? – user1508454
@ user1508454: ver mis actualizaciones –