Ich habe eine Klasse, auf die mehrere Threads zugreifen, und ich möchte sicherstellen, dass es threadsicher ist. Außerdem muss es so schnell wie möglich sein. Dies ist nur ein Beispiel:Synchronisierte VS Striped Lock
public class SharedClass {
private final Map<String, String> data = new HashMap<>();
private final Striped<ReadWriteLock> rwLockStripes = Striped.readWriteLock(100);
public void setSomethingFastVersion(String key, String value) {
ReadWriteLock rwLock = rwLockStripes.get(key);
try {
rwLock.lock();
} finally{
rwLock.unLock();
}
data.put(key, value);
}
public synchronized void setSomethingSlowVersion(String key, String value) {
data.put(key, value);
}
}
Ich verwende StripedLock
von Google Guava in einer Version, und ein normales synchronized
auf dem anderen.
Stimmt es, dass die Guava-Version schneller sein sollte?
Wenn ja, was wäre ein guter Anwendungsfall für synchronized
, wo die StripedLocks
würde nicht passen?
Übrigens, ich weiß, ich könnte hier eine einfache ConcurrentHashMap
verwenden, aber ich füge den Beispielcode hinzu, um sicherzustellen, dass Sie meine Frage verstehen.
Zuerst muss Ihr 'data.put (k, v)' in Ihrem 'try' Block sein. Im Allgemeinen sind bestimmte verwaltete Sperren schneller als die Synchronisierung. Benchmarking wird bestimmen, ob das in Ihrem Fall der Fall ist. Sie verwenden hier auch eine ReadWrite-Sperre. Brauchst du dieses Verhalten? Ich sehe hier keine Lektüre, wie würdest du sie umsetzen? – WillD
@WillD was kann man dann anstelle von 'ReadWriteLock' verwenden? – Will
[ReentrantLock] (https://docs.oracle.com/javase/lock/docs/api/java/util/concurrent/locks/ReentrantLock.html) – WillD