reentrantreadwritelock

___ answer12174318 ___

Es scheint, dass Sie nicht sicher sind, wie das, was Peter Lawrey vorschlägt, umgesetzt werden kann. Es könnte so aussehen:

%Vor%

Es gibt keine Nebenläufigkeitsprobleme, weil:

  • Die neue Map wird über eine lokale Variable erstellt, die definitionsgemäß nicht geteilt wird - %code% muss nicht synchronisiert oder atomar sein
  • Die Zuordnung zu %code% ist atomar
  • %code% ist flüchtig, was garantiert, dass andere Threads die Änderung sehen
___ tag123java ___ Java (nicht zu verwechseln mit JavaScript oder JScript oder JS) ist eine universelle objektorientierte Programmiersprache, die für die Verwendung in Verbindung mit der Java Virtual Machine (JVM) entwickelt wurde. "Java-Plattform" ist der Name für ein Computersystem, auf dem Tools zum Entwickeln und Ausführen von Java-Programmen installiert sind. Verwenden Sie dieses Tag für Fragen, die sich auf die Java-Programmiersprache oder Java-Plattform-Tools beziehen. ___ tag123design ___ Design in der Programmierung ist der Akt, bestimmte Entscheidungen darüber zu treffen, wie man ein Programm am besten strukturiert, um Ziele der Zuverlässigkeit, Wartbarkeit, Korrektheit oder Benutzerfreundlichkeit zu erreichen. ___ answer12109211 ___

Da Sie die Map neu laden, würde ich sie bei einem Reload ersetzen.

Sie können dies tun, indem Sie eine flüchtige Map verwenden, die Sie bei der Aktualisierung vollständig ersetzen.

    
___ tag123locking ___ Durch das Sperren können verschiedene Arten von Ressourcen ausschließlich von jeweils einem Prozess verwendet werden. ___ qstntxt ___

Java Gurus,

Derzeit haben wir eine %code% , die häufig gelesen und gelegentlich geändert wird und wir haben Probleme, dass Lesen bei der Änderung / beim erneuten Laden %code% zurückgibt. was nicht akzeptabel ist.

Um das zu beheben, habe ich folgende Optionen:

A. Verwenden Sie ConcurrentHashMap

Was wie die erste Wahl aussieht, aber die Operation, von der wir sprechen, ist %code% - bedeutet %code% gefolgt von %code% . Wenn also %code% nach %code% und pre %code% gelesen wird, gibt es null zurück, was nicht wünschenswert ist. Selbst wenn ich %code% behebe, behebt dies das Problem nicht.

B. Erstellen Sie eine andere Implementierung basierend auf ReentrantReadWriteLock

Wo ich create %code% vor %code% operation erstellen würde. Dies scheint passender zu sein, aber ich denke, dass es dafür schon etwas geben muss und ich das Rad nicht neu erfinden muss.

Was ist der beste Ausweg?

BEARBEITEN Ist eine Sammlung bereits mit einer solchen Funktion verfügbar?

    
___ tag123concurrenthashmap ___ Die Java-ConcurrentHashMap-Datenstruktur. Die ConcurrentHashmap ist eine Hash-Tabelle, die die vollständige Parallelität von Abrufvorgängen und die erwartete erwartete Parallelität für Aktualisierungen unterstützt. Es ermöglicht die gleichzeitige Änderung der Map aus mehreren Threads, ohne sie blockieren zu müssen ___ tag123reentrantreadwreckelock ___ ReentrantReadWriteLock ist eine Java-Klasse, die die Sperre für die Arbeit mit mehreren Threads bereitstellt. ___ answer12113152 ___

Dies klingt ein Los wie Guavas %code% , obwohl es wirklich darauf ankommt, wie Sie die Karte auffüllen und wie Sie die Werte berechnen. (Offenlegung: Ich trage zu Guava bei.)

Die eigentliche Frage ist, ob Sie angeben können, wie Sie Ihre %code% mit der Eingabe %code% berechnen. Nur basierend auf dem, was Sie uns bisher gesagt haben, könnte es in etwa so aussehen ...

%Vor%

Wenn Sie den Cache neu aufbauen möchten, rufen Sie einfach %code% auf. Mit %code% können Sie %code% aufrufen und wenn der Wert noch nicht berechnet wurde, wird er neu berechnet. Oder vielleicht nach dem Aufruf von %code% , können Sie %code% aufrufen, obwohl Sie immer noch einzelne Elemente laden können, falls zwischen den %code% und %code% eine Anfrage eingeht.

Wenn das nicht akzeptabel ist - wenn Sie nicht einen Wert einzeln laden können, müssen Sie alle auf einmal laden - dann würde ich mit Peter Lawreys Ansatz fortfahren - behalten Sie eine %code% -Referenz bei eine Karte (im Idealfall %code% ), berechnen Sie die gesamte Karte neu und weisen Sie die neue Karte der Referenz zu, wenn Sie fertig sind.

    
___ qstnhdr ___ ConcurrentHashMap vs ReentrantReadWriteLock basierte Custom Map für das Neuladen ___
1
Antwort

Warum ist das ReadWriteLock-Upgrade nicht erlaubt?

ReadWriteLock downgrade ist erlaubt von ReentrantReadWriteLock implementation ( tryLock() aus dem Beispiel unten gibt immer true zurück): %Vor% Was war die Idee dahinter, ein Lock-Upgrade auf ähnliche Weise nicht zuzulassen? Die...
26.10.2015, 09:43
3
Antworten

ConcurrentHashMap vs ReentrantReadWriteLock basierte Custom Map für das Neuladen

Java Gurus, Derzeit haben wir eine HashMap<String,SomeApplicationObject> , die häufig gelesen und gelegentlich geändert wird und wir haben Probleme, dass Lesen bei der Änderung / beim erneuten Laden null zurückgibt. was nicht a...
24.08.2012, 12:11