Seguridad de subprocesos en el código del lado del servidor

Soy nuevo en la codificación del lado del servidor y JSP/servlets. Tengo un código que tiene 3 clases. 1st es una clase Serv heredada de java httpservlet. En esto tengo implementado el método doPost(). En doPost() utilizo el objeto de la segunda clase ResourceClass. ResourceClass es una clase singleton. Por lo tanto, esencialmente, usar cualquier método es hacer algo como ResourceClass.getInstance().readResource(); Ahora readResource usa la biblioteca de acceso nativo de Java para leer un recurso del disco. Ahora mi pregunta es porque, según tengo entendido, si 2 clientes se conectan a mi servidor (Apache Tomcat) para cada nueva solicitud, tendré un nuevo servlet que atenderá la solicitud. Pero todos estos servlets usarán esencialmente el mismo objeto singleton. Por lo tanto, esta lectura será segura para subprocesos.

No cambio ningún estado interno. Así que creo que no afectará mi salida, por lo tanto, todo es idempotente. Pero, ¿todas estas solicitudes se pondrán en cola, lo que hará que el objeto de clase singleton sea un cuello de botella? O cada servlet tendrá su propia copia.

Además, si cambio el estado del recurso, en ese caso será seguro para subprocesos.

preguntado el 03 de mayo de 12 a las 08:05

2 Respuestas

En primer lugar, no tendrá un nuevo servlet para cada solicitud. Se utilizará la misma instancia única de servlet para manejar simultáneamente todas las solicitudes. El servlet también es un singleton: el contenedor web instancia solo una instancia.

Usted dice que las solicitudes a su recurso único ResourceClass se pondrán en cola. No lo harán, a menos que marque el método como synchronized o utilice algún otro mecanismo de bloqueo. Si no lo hace, los subprocesos invocarán su método singleton al mismo tiempo.

Es imposible decir si es seguro para subprocesos o no sin ver el código de su singleton y el código de la biblioteca JNI. El hecho de que sea de sólo lectura es una señal de que podría sea ​​seguro para subprocesos, pero no está garantizado.

contestado el 03 de mayo de 12 a las 08:05

Gracias JB. Creo que debería leer un buen tutorial sobre cómo se redactan los contenedores de servlet. Tu respuesta es muy informativa. - user1294764

En un servidor Java EE, solo tiene 1 instancia de cada servlet. Por otro lado, cada solicitud http es procesada por el servidor en su propio hilo.

Hay una instancia de ResourceClass porque es un singleton por lo que tendrá un cuello de botella si el readResource() el método está sincronizado.

contestado el 03 de mayo de 12 a las 08:05

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.