Normalerweise würde ich einen kritischen Abschnitt wie den folgenden sperren.Verwendung eines Schlüssels zum Synchronisieren des Zugriffs auf den Codeblock
public class Cache {
private Object lockObject = new Object();
public Object getFromCache(String key) {
synchronized(lockObject) {
if (cache.containsKey(key)) {
// key found in cache - return cache value
}
else {
// retrieve cache value from source, cache it and return
}
}
}
}
Die Idee, den ich eine Race-Bedingung zu vermeiden, die in der Datenquelle getroffen zu mehreren Malen und der Schlüssel werden hinzugefügt, um den Cache mehrmals führen könnten.
Gerade jetzt, wenn zwei Threads in etwa zur gleichen Zeit für verschiedene Cache-Schlüssel kommen, werde ich immer noch eins blockieren.
Angenommen, die Schlüssel sind eindeutig - funktioniert das Schloss weiterhin, indem der Schlüssel gesperrt wird?
Ich denke, wird es nicht funktionieren, weil ich verstehe, dass die Objektreferenz die gleiche sein sollte, damit das Schloss in Kraft tritt. Ich denke, das kommt darauf an, wie es auf Gleichheit prüft.
public class Cache {
public Object getFromCache(String key) {
synchronized(key) {
if (cache.containsKey(key)) {
// key found in cache - return cache value
}
else {
// retrieve cache value from source, cache it and return
}
}
}
}
Nein. Die Ressource, die Sie schützen müssen, ist der Cache, nicht der Schlüssel. Was Sie vorschlagen, macht keinen Sinn. – EJP
In der Regel würde der Schlüssel in ein Array von Sperrobjekten hashen, um das Instanzproblem zu vermeiden. Dies wird als Striping bezeichnet, bei dem der Stripe (Ressource) durch diese Sperre vor möglichen Mutationen geschützt wird. In Ihrem Beispiel eines Caches wird dies Memoisierung genannt, um einen [Cache-Ansturm] (https://en.wikipedia.org/wiki/Cache_stampede) zu vermeiden, indem der interne Hash-Tabelleneintrag gesperrt wird. Um das Sperren eines Lesevorgangs zu vermeiden, würde dies ein optimistisches Get-and-Fallback (doppelt geprüftes Locking) verwenden. [Caffeine] (https://github.com/ben-manes/caffeine) und andere Caches implementieren diese Technik. –
Danke Ben Ihre Erklärung war nützlich. Ich werde eine Reihe von Sperren vorstellen, die auf den Schlüssel gehackt sind. – Avner