Erfordern Singleton / Session-Bereiche von Spring-Beans, dass der Zugriff auf alle Felder synchronisiert werden muss? Sprechen Sie über "synchronized" Schlüsselwort oder verwenden Sie einige Klassen aus dem Paket "java.util.concurrent".
Als Beispiel, ist dieser Code nicht threadsicher? (Kopieren von hier ):
%Vor% Wenn Sie singleton
scope aus dem Spring-Container verwenden, geben Sie an, dass alle Threads, die die Bean aus dem Container abrufen, dieselbe Instanz verwenden. In diesem Fall, in dem die Zustandsliste des Elements zwischen Threads geteilt und geändert werden kann, müssen Sie den Zugriff auf die Liste synchronisieren, um Ihre Anwendung gegen ein ConcurrentModificationException
zu schützen.
Die übliche Vorgehensweise bei Spring besteht jedoch darin, Ihre Anwendung mit zustandslosen Objekten zu erstellen, die keinen Zustand haben, der sich während der gesamten Lebensdauer der Anwendung ändert.
Im Fall von session
scope ist es weniger wahrscheinlich, dass ein Concurrency-Problem auftritt, da die Bean nur für den aktuell angemeldeten Benutzer verfügbar ist. Es ist jedoch (zumindest im Web) möglich, dass mehrere Anfragen in derselben Sitzung eingehen. In diesem Fall müssten Sie die gleichen Vorsichtsmaßnahmen treffen, als wäre die Bean ein Singleton.
Wiederum ist der beste Weg, sich zu schützen, zu versuchen, Ihre Bohne so statusfrei wie möglich zu halten. Wenn Sie eine Bean haben, die einen Zustand erfordert, sollten Sie den prototype
-Bereich in Betracht ziehen, der jedes Mal eine neue Instanz der Bean aus dem Container abruft.
Nur der Benutzer für diese Sitzung kann auf diese Klasse zugreifen, aber ArrayList ist nicht Thread-sicher, wie in dieser Diskussion gezeigt: Ссылка
Sie müssen sicherstellen, dass Ihre Klasse vollständig Thread-sicher ist, da SessionScope nur sicherstellt, dass sie nur von jeder Sitzung verwendet wird, sodass eine Sitzung nicht darauf zugreifen kann.
Sie können sich die Kommentare in dieser Diskussion für weitere Informationen ansehen: Ссылка
Grundsätzlich wird für jeden Benutzer, der eine Sitzung initiiert, ein neuer ShoppingCart
erstellt und für diesen Benutzer auf diese Sitzung festgelegt.
Ihre Klasse ist Thread-sicher. Die Initialisierung
%Vor%ist eine Thread-sichere Initialisierung und
addItem(Product item)
ist eine atomare Operation und daher auch Thread-sicher.
Tags und Links java spring scope concurrency