¿Cuándo es inseguro un subproceso de servlet?
En primer lugar, ¿qué es la seguridad de subprocesos?
Concepto de referencia: si hay varios subprocesos ejecutándose en el proceso donde se encuentra su código, estos subprocesos pueden ejecutar este código al mismo tiempo. Es seguro para subprocesos si los resultados de cada ejecución son los mismos que los de una ejecución de un solo subproceso y si otras variables tienen los mismos valores esperados.
Todos sabemos que el servlet es multiproceso. Una clase de implementación de servlet solo tendrá un objeto de instancia, lo que significa que es un Singleton, por lo que es posible que varios subprocesos accedan al mismo objeto de instancia de servlet.
Cada subproceso abrirá una referencia separada al objeto de instancia de datos, entonces, ¿será el servlet seguro para subprocesos?
Para determinar si es seguro para subprocesos, necesitamos saber qué causa los problemas de seguridad de subprocesos.
Buscar respuestas: los problemas de seguridad de los subprocesos son causados por variables globales y variables estáticas.
Esta es una descripción encontrada en línea: un error investigado hace muchos años. En ese momento, muchas variables globales estaban escritas en el código restante de nuestro sistema. Una vez publicado, los clientes informaron que muchas personas estaban realizando la misma operación al mismo tiempo y que nuestros datos eran incorrectos. El resultado de nuestra investigación en ese momento fue que cuando muchas personas se sincronizaban, algunas variables globales estaban incorrectas. Luego configuramos a una persona especialmente y dedicamos mucho tiempo a cambiar todas las variables globales a variables locales. Resulta que ya me había encontrado con una situación de subprocesos inseguros en ese momento, pero la solución fue no usar la situación global o agregar sincronización. Si se agrega sincronización, considere si afectará la eficiencia del programa.
Por lo tanto, si un servlet es seguro para subprocesos depende de su implementación. No es seguro para subprocesos si varios subprocesos cambian sus propiedades o métodos internos y viceversa.
Encontré un ejemplo en Internet, como sigue:
La clase pública TestServlet extiende HttpServlet {
private int count = 0;
@ Anular
Servicio anulado protegido (solicitud HttpServletRequest, respuesta HttpServletResponse)
Lanza ServletException, IOException {
response.getWriter(). println(" <HTML><text>);
response.getWriter().println(this + " ==>);
response.getWriter(). println(hilo . hilo actual()+":<br>);
for(int I = 0;i<5;i++){
response.getWriter ().println (" count = "+count+" <BR>);
Pruebe {
thread.sleep(1000);
count++;
} catch(Excepción e) {
e . printstacktrace();
}
}
response.getWriter( ). println(" </BODY></HTML>);
}
}
Cuando se abren varios navegadores al mismo tiempo, ingrese /zyl 1042635242/article/details/47416487