Ich habe Guava-Cache mit Speicher userId Mutex-Cache.Guava-Cache asMap-Methode
Cache<Long, Object> byUserIdMutex = CacheBuilder.newBuilder()
.concurrencyLevel(4)
.weakKeys()
.maximumSize(10000)
.expireAfterWrite(10, TimeUnit.MINUTES)
.build();
private Object getMutex(long userId) {
Object newLock = new Object();
Object old = byUserIdMutex.asMap().putIfAbsent(userId, newLock);
if (old != null) {
return old;
}
return newLock;
}
Dann verwende ich synchronisierte Abschnitt mit Mutex-Objekt. Ich erwarte, dass derselbe Benutzer von verschiedenen Threads auf eine andere Aufgabe wartet, damit der gleiche Schlüssel vervollständigt wird.
Lasst uns sagen, wenn ich Faden 1
synchronized (getMutex(1)) {
}
haben dann 2 für 1-Thread wartet Thread-Ausführung verlassen synchronisiert, bevor fertig, aber es stellt sich heraus, dass es nicht geschieht, warten Fäden nicht miteinander .
Vielleicht habe ich ein Rennen bei der Umwandlung von Guava-Cache in Karte mit asMap() -Methode?
Betrachten Sie stattdessen Guava 'Striped' zum Sperren, anstatt einen Cache. –
@BenManes passt nicht für mich. Auch wenn ich Striped mit genügend Streifen (Locks) im Inneren erzeuge, kann es zu einer Kollision kommen, wenn verschiedene Benutzer auf einander warten. – user12384512
Ein großer fauler schwacher Streifen ist eine schwach bewertete Karte. Das wäre also eine sicherere Räumungspolitik. –