No necesita bloquear ya que session.setAttribute()
es seguro para la ejecución de subprocesos (consulte el comentario de la especificación de servlet de @McDowell anterior).
Sin embargo, usemos un ejemplo diferente. Digamos que quería comprobar el valor del atributo y luego actualizarlo si < = 100. En este caso, necesitaría sincronizar el bloque de código para getAttribute()
, la comparación < = 100 y setAttribute()
.
Ahora, ¿qué deberías usar para la cerradura? Recuerde que no hay sincronización si se usan diferentes objetos para el bloqueo. Entonces, diferentes bloques de código deben usar el mismo objeto. Su elección del objeto session
puede estar bien. Recuerde también que los diferentes bloques de código pueden acceder a la sesión (tanto de lectura como de escritura) incluso si ha tomado un bloqueo, a menos que ese otro código también se bloquee en el objeto de sesión. Una trampa aquí es que demasiados lugares en su código bloquean el objeto de sesión y, por lo tanto, tienen que esperar. Por ejemplo, si su bloque de código usa el atributo de sesión A y otro trozo de código utiliza el atributo de sesión B, sería bueno si no necesitaran esperar el uno al otro con un bloqueo en el objeto de sesión. El uso de objetos estáticos llamados LockForA y LockForB podría ser una mejor opción para que su código lo use, p. synchronized (LockForA) { }.
Esto no es un bloqueo doble, esto simplemente está poniendo un valor en un mapa si no existe ya. – Yishai
De acuerdo, es temprano. Eliminado – Kevin
¿Va a hacer que el bloqueo sea estático para mi clase (que no es un servlet, sino una clase que se crea desde una página jsp) para garantizar que todas las solicitudes se sincronicen en el mismo bloqueo? – MCS