Wenn ich unten eine Java-Klasse definiert habe, die über die Dependency-Injektion in meine Webanwendung injiziert wird:
%Vor%Ich bin besorgt über die Sicherheit von Fäden. Kann das Spring-Framework keine Fälle behandeln, in denen eine Anfrage von der Liste gelesen wird und sie gerade von einer anderen aktualisiert wird? Ich habe zuvor in anderen Anwendungen Lese- / Schreibsperren verwendet, aber ich habe nie zuvor über einen Fall wie oben nachgedacht.
Ich wollte die Bean als Singleton verwenden, um die Datenbanklast zu reduzieren.
Übrigens ist dies ein Follow-up der folgenden Frage:
Java Memory Storage zu reduzieren Datenbank laden - sicher?
BEARBEITEN:
Also würde Code wie dieses das Problem lösen:
%Vor%Spring framework tut nichts in Bezug auf das Multithread-Verhalten einer Singleton-Bean. Es liegt in der Verantwortung des Entwicklers, das Problem der Parallelität und Thread-Sicherheit der Singleton-Bean zu behandeln.
Ich würde vorschlagen, den folgenden Artikel zu lesen: Spring Singleton, Request, Session Beans und Thread Safety
Sie hätten um eine Klarstellung zu meinem Initial gebeten Antwort Spring synchronisiert den Zugriff auf eine Bean nicht. Wenn Sie eine Bean im Standardbereich (Singleton) haben, gibt es nur ein einzelnes Objekt für diese Bean, und alle gleichzeitig ablaufenden Anforderungen greifen auf dieses Objekt zu und benötigen dieses Objekt für den Thread-Safe.
Die meisten Frühlingsbohnen haben keinen veränderlichen Zustand und sind daher fadensicher. Ihre Bean hat einen änderbaren Status. Sie müssen also sicherstellen, dass kein Thread eine Liste von Accounts sieht, die der andere Thread gerade erstellt.
Der einfachste Weg ist, das Kontenfeld volatile
zu erstellen. Das setzt voraus, dass Sie die neue Liste dem Feld zuweisen, nachdem Sie es ausgefüllt haben (wie Sie scheinen).
Wir haben viele solcher Metadaten und haben 11 Knoten laufen. auf jedem App-Knoten haben wir statische Karten für solche Daten, also nur eine Instanz, init von db beim Start einmal außerhalb der Hauptverkehrszeit jeden Tag oder wenn die Support-Person sie auslöst. haben eine interal einfache HTTP-Post-basierte API, um Updates von 1 Knoten an andere für einige der Daten zu senden, die wir in Echtzeit aktualisieren müssen.
%Vor%Tags und Links java multithreading spring