Est HttpSession thread-safe, sont set/get Attribut thread-safe opérations?
Ailleurs, l'objet qui est mis à être thread-safe afin de garantir que nous savons que l'état de l'objet stocké dans la session.
Aussi, j'ai lu sur le web que certains proposent de l'aide:
synchronized(session) {
session.setAttribute("abc", "abc");
}
Est-ce là une suggestion?
Vous devez vous connecter pour publier un commentaire.
Non, ils ne sont pas thread-safe, selon IBM - Java la théorie et la pratique: la dynamique des applications Web cassé?. Vous devez synchroniser.
Comment HttpSession n'est pas thread-safe de Java Ranch peut être utile, aussi.
Servlet 2.5 spec:
C'est sûr:
C'est pas sûre:
C'est pas garanti pour être sûr:
J'ai vu cette dernière approche préconisée (y compris en J2EE livres), mais il n'est pas garanti par la spécification Servlet. Vous pourriez utiliser l'ID de session pour créer un mutex, mais il doit y avoir une meilleure approche.
this
. Ce qui est, a une signature commepublic syncrhonized void setAttribute...
ou...setAttribute(String s,Object o) { synchronized(this)...
. La spec ne l'exige pas. Certains conteneurs de servlet ce faire, mais il n'y a pas de garanties - comment le contenant protège l'état interne est un détail d'implémentation.Object foobject = request.getSession().getAttribute("foo"); synchronized(fooObject) { //do some thread-sensitive work on fooObject }
Pas. Et puisque vous ne voulez pas le même client (avec session) pour faire des demandes simultanées, vous devriez sérialiser ces demandes comme la AbstractController dans Spring MVC
À certains égards, cela dépend de votre conception du client.
Avez-vous la possibilité, dans votre conception de sites web, pour un seul client à avoir en attente plusieurs demandes simultanées à l'aide de la même session HTTP? Cela semble difficile à faire, sauf si vous attachez une seule session HTTP sur de multiples supports. (aka, AJAX) de moins que de faire cela, un client HTTP, l'accès sera monothread autant que le serveur est concerné, ce qui signifie une seule séance est effectivement Thread-safe.
La synchronisation de vos objets de session permettra à l'application de sûr contre les changements futurs qui feront de votre application web capable d'avoir plusieurs demandes simultanées, il n'est donc pas une mauvaise idée. Moderne implémentations Java, la synchronisation n'a pas l'ampleur des coûts qui a été précédemment associé avec elle, en particulier lorsque la synchronisation est généralement uncontended. Si votre application utilise l'AJAX, ce qui implique que vous vous attendez à plusieurs en vol demandes simultanées de votre serveur web, la synchronisation est un must.
Ils ne le sont pas, mais la plupart du temps, vos clients auront accès uniquement avec un seul thread.
Différents clients ont des threads différents et chacun aura sa propre Session.
Comme Eddie points, une situation où vous pouvez faire face à deux threads accèdent à la même session est de deux appels ajax sont de tenter de modifier le même attribut de session. Sinon, vous n'aurez pas de problèmes.
La session n'est pas thread-safe et ni l'obtenez pas l'ensemble des méthodes sont garantis d'être thread-safe. En général dans un conteneur de servlet, vous devriez penser être dans un environnement multithread et sans condition de l'outillage est sûr.
Cela vaut également pour les objets que vous stockez dans la session. La session elle-même ne pas manipuler l'objet stocké, mais vous pouvez récupérer l'objet dans les différents thread et de tenter de le manipuler. C'est à vous d'examiner votre propre code pour voir si les conditions de course sont possibles.
L'exemple de code que vous avez posté est valide, mais le problème peut exister au-delà de la portée limitée de votre exemple. Il assure il n'y a pas de conditions pendant le réglage de la session, mais il n'y a rien qui empêche un autre thread pour remplacer l'ensemble. Si le code de votre demande dépend de la valeur reste inchangé, vous pouvez toujours être en difficulté.