getparameter java session thread-safety synchronized

java - getparameter - ¿HttpSession es seguro para las hebras, se configuran/obtienen las operaciones seguras de subprocesos de atributo?



request.getparameter java (6)

Además, el objeto que se está configurando debe ser seguro para garantizar que sepamos cuál es el estado del objeto almacenado en la sesión.

Además, estaba leyendo en la web que algunos sugieren usar:

synchronized(session) { session.setAttribute("abc", "abc"); }

¿Es esta una sugerencia válida?


De alguna manera, esto depende del diseño de su cliente.

¿Tiene la oportunidad, en su diseño web, de que un solo cliente tenga múltiples solicitudes simultáneas pendientes utilizando la misma sesión HTTP? Esto parece difícil de hacer a menos que vincule una sola sesión HTTP a varios sockets. (aka, AJAX) A menos que lo haga, el acceso HTTP de un cliente determinado será de un solo hilo en lo que respecta al servidor, lo que significa que una sola sesión es efectivamente segura.

La sincronización de sus objetos de sesión hará que la aplicación sea más segura contra cambios futuros que hacen que su aplicación web sea capaz de tener múltiples solicitudes simultáneas, por lo que no es una mala idea. En las implementaciones modernas de Java, la sincronización no tiene el gran costo que anteriormente se asociaba con ella, especialmente cuando la sincronización generalmente no está garantizada. Si su aplicación usa AJAX, lo que implica que espera múltiples solicitudes simultáneas en vuelo a su servidor web, entonces la sincronización es imprescindible.


Especificación de Servlet 2.5:

Varios servlets que ejecutan subprocesos de solicitud pueden tener acceso activo al mismo objeto de sesión al mismo tiempo. El contenedor debe garantizar que la manipulación de las estructuras de datos internas que representan los atributos de la sesión se realice de forma segura para los hilos. El Desarrollador tiene la responsabilidad del acceso en modo de ejecución a los objetos de atributo en sí mismos. Esto protegerá la colección de atributos dentro del objeto HttpSession del acceso concurrente, eliminando la oportunidad de que una aplicación se corrompa.

Esto es seguro

// guaranteed by the spec to be safe request.getSession().setAttribute("foo", 1);

Esto no es seguro

HttpSession session = request.getSession(); Integer n = (Integer) session.getAttribute("foo"); // not thread safe // another thread might be have got stale value between get and set session.setAttribute("foo", (n == null) ? 1 : n + 1);

Esto no está garantizado para ser seguro:

// no guarantee that same instance will be returned, // nor that session will lock on "this" HttpSession session = request.getSession(); synchronized (session) { Integer n = (Integer) session.getAttribute("foo"); session.setAttribute("foo", (n == null) ? 1 : n + 1); }

He visto este último enfoque defendido (incluso en los libros de J2EE), pero no está garantizado que funcione según la especificación de Servlet. Puede usar la ID de sesión para crear un mutex , pero debe haber un mejor enfoque.


La sesión no es segura para subprocesos y no se garantiza que los métodos get get the set sean seguros para subprocesos. En general, en un contenedor de servlets, debe suponerse que se encuentra en un entorno de múltiples hilos y que ninguna herramienta proporcionada es segura.

Esto también se aplica a los objetos que almacena en la sesión. La sesión en sí no manipulará el objeto almacenado, pero puede recuperar el objeto en diferentes hilos e intentar manipularlo. Depende de usted examinar su propio código para ver si las condiciones de carrera son posibles.

El ejemplo de código que publicó es válido, pero el problema puede existir más allá del alcance limitado de su ejemplo. Asegura que no hay condiciones durante la configuración de la sesión, pero no hay nada que impida que otro hilo anule el conjunto. Si el código en su solicitud depende de que el valor permanezca inalterado, aún podría tener problemas.


No lo son, pero la mayoría de las veces, sus clientes solo accederán a ellos con un solo hilo.

Diferentes clientes tendrán diferentes hilos y cada uno tendrá su propia Sesión.

Como señala Eddie, una situación en la que puede enfrentar dos subprocesos accediendo a la misma sesión es que dos llamadas ajax intentan modificar el mismo atributo de sesión. De lo contrario, no tendrás problemas.



No. Y dado que no desea que el mismo cliente (con sesión) haga solicitudes simultáneas, debe serializar estas solicitudes como lo hace AbstractController en Spring MVC.