Nehmen wir an, Sie haben folgende Klasse:
%Vor%Ich möchte erlauben:
getFoo()
modifyFoo()
, 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?
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:
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.
Sie sollten ein ReentrantReadWriteLock verwenden . Mehrere Threads können lesen, ein Thread kann schreiben, was alle Lesevorgänge blockiert.
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.
Tags und Links java multithreading synchronization