Feder Singleton Gewindesicherheit

8

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%     
thatidiotguy 13.03.2013, 21:14
quelle

4 Antworten

13

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

    
Lan 13.03.2013, 21:27
quelle
2

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).

%Vor%     
meriton 13.03.2013 21:31
quelle
1

Als Singleton und nicht synchronisiert ermöglicht Spring einer beliebigen Anzahl von Threads gleichzeitig isActiveAccount und refreshAccounts aufzurufen. Also, nein, diese Klasse wird nicht Thread-sicher und wird die Datenbanklast nicht reduzieren.

    
John Vint 13.03.2013 21:20
quelle
0

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%     
tgkprog 13.03.2013 21:45
quelle

Tags und Links