2012-07-14 12 views

Respuesta

22

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.

+0

@ 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

+0

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

+0

@ user1508454: ver mis actualizaciones –

Cuestiones relacionadas