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:
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.
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?
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.