Printemps: Singleton/session étendues et de la concurrence
Ne singleton/session étendues de beans Spring exigent que l'accès à l'ensemble de ses champs doivent être synchronisées? Dire par "synchronisée", mot-clé ou à l'aide de certaines classes du package "java.util.simultané".
À titre d'exemple, est-ce code pas thread-safe? (copier/transmis de ici):
@Component
@SessionScoped
public class ShoppingCart {
private List<Product> items = new ArrayList<Product>();
public List<Product> getAllItems() {
return items;
}
public void addItem(Product item) {
items.add(item);
}
}
OriginalL'auteur Alex Siman | 2009-11-17
Vous devez vous connecter pour publier un commentaire.
Lorsque vous utilisez
singleton
champ d'application à partir du Printemps conteneur, vous indiquez que tous les threads récupérer le haricot de la le conteneur va utiliser la même instance. Donc, dans ce cas, où l'état de la liste de l'article est partagé et modifiables entre les threads, vous devez synchroniser l'accès à la liste pour protéger votre application contre unConcurrentModificationException
.Cependant, la pratique habituelle avec le Printemps est de créer votre application avec apatrides objets, qui n'ont pas l'etat qui va changer tout au long de la vie de l'application.
Dans le cas de
session
portée, vous pourriez être moins de chances de voir un des problèmes de simultanéité depuis le haricot ne seront accessibles par l'utilisateur actuellement connecté. Toutefois, il est possible (au moins sur le web) d'avoir plusieurs demandes provenant de la même session, auquel cas vous devez prendre les mêmes précautions que si les haricots ont un singleton.Encore la meilleure façon de vous protéger est d'essayer de garder votre bean stateless que possible. Si vous avez un haricot qui exige de l'état, vous devriez envisager d'utiliser la
prototype
portée, qui récupère une nouvelle instance du bean à partir du conteneur à chaque fois.OriginalL'auteur Jason Gritman
Seul l'utilisateur pour cette session peuvent accéder à cette classe, mais ArrayList n'est pas thread-safe, comme on le voit dans cette discussion: http://forums.sun.com/thread.jspa?threadID=5355402
Vous devez vous assurer que votre classe est entièrement thread-safe comme SessionScoped va juste s'assurer qu'il est seulement utilisé par chaque session, une session peut pas y accéder.
Vous pouvez regarder les commentaires dans cette discussion pour plus d'info:
http://wheelersoftware.com/articles/spring-session-scoped-beans.html
OriginalL'auteur James Black
Fondamentalement pour chaque utilisateur qui ouvre une session un nouveau
ShoppingCart
seront créés, et l'étendue de la session par l'utilisateur.Votre classe est thread-safe. L'initialisation
est un "thread-safe" de l'initialisation et
addItem(Product item)
est une opération atomique et est donc aussi thread-safe.La classe n'est pas thread-safe, car les articles de la collection n'est pas en toute sécurité publiés; les articles.ajouter() ne fournit pas de garantie que son effet est visible par le fil conducteur de courant et il n'est pas atomique.
Hmmm, j'étais sous l'impression que le fait que la classe est également
SessionScoped
et ne peut être traité par un seul acteur dans le Ressort conteneur de garantir la sécurité des threads de la classe?Je pense qu'il pourrait être sûr si CopyOnWriteArrayList est utilisé
OriginalL'auteur non sequitor