Java-Klasse, damit mehrere Threads gleichzeitig gelesen oder geändert werden können

8

Nehmen wir an, Sie haben folgende Klasse:

%Vor%

Ich möchte erlauben:

  • entweder mehrere Threads zum Aufruf von getFoo()
  • oder ein Thread zum Aufrufen von modifyFoo() ,
  • sobald ein Thread foo ändern möchte, dürfen keine weiteren neuen getFoo() -Aufrufe, die danach ankommen, ausgeführt werden, bis die Änderung erfolgt ist.

Gibt es in Java bereits Klassen für dieses Problem oder muss ich es implementieren? Wenn ich es implementieren muss, wie kann ich dann sicherstellen, dass die Thread-Sicherheit gewährleistet ist?

    
SolidSun 22.11.2011, 16:12
quelle

4 Antworten

12

Es klingt nach dem, was Sie suchen, ist ein Read-Write-Lock, glücklicherweise bietet Java einen, ReentrantReadWriteLock . Sie können es wie folgt verwenden:

%Vor%

Damit können beliebig viele Threads getFoo() gleichzeitig aufrufen, aber nur eine, um modifyFoo() aufzurufen. Wenn modify foo aufgerufen wird, blockiert der Thread, bis alle Lesesperren freigegeben sind, und beginnt dann mit der Ausführung und verhindert, dass neue Lesesperren erfasst werden, bis sie beendet sind. Es gibt immer noch Probleme mit der Parallelität, da das zurückgegebene Foo durch den Code geändert werden kann, der getFoo aufruft. Dies sollte jedoch das grundlegende Werkzeug bereitstellen, das Sie benötigen.

    
nonVirtualThunk 22.11.2011, 16:21
quelle
4

Sie sollten ein ReentrantReadWriteLock verwenden . Mehrere Threads können lesen, ein Thread kann schreiben, was alle Lesevorgänge blockiert.

    
Chris Dennett 22.11.2011 16:20
quelle
1
%Vor%

Das synchronized -Schlüsselwort stellt sicher, dass modifyFoo() atomar ist, das heißt, mehrere Threads können es nicht gleichzeitig aufrufen. Das Schlüsselwort volatile stellt sicher, dass die Lesevorgänge in foo keine zwischengespeicherte Version zurückgeben (die veraltet sein könnte, wenn ein anderer Thread sie geändert hat) und stattdessen den aktuellen, korrekten Wert zurückgibt.

    
Travis Webb 22.11.2011 16:16
quelle
0

Sie sollten mit einem synchronisierten Block auskommen.

%Vor%     
Doug Stephen 22.11.2011 16:19
quelle