2016-02-15 3 views
6

Ich benötige einen Schlüsselverriegelungsmechanismus zum Schutz kritischer Schlüsselbereiche.Wäre Guavas Cache <K, Semaphore> mit weakValues ​​() threadsicher?

Obwohl ein ConcurrentMap<K, Semaphore> würde ausreichen für Parallelität, möchte ich auch nicht die Karte alte Schlüssel ansammeln und unbegrenzt wachsen.

Idealerweise wird die Datenstruktur (oder direkt danach) den Speicher freigeben, der für Schlüssel verwendet wird, für die die Sperren nicht verwendet werden.

Ich denke Art Cache mit weakValues() gebaut Guava das würde den Trick:

private static final LoadingCache<K, Semaphore> KEY_MUTEX = CacheBuilder.newBuilder() 
     .weakValues() 
     .build(new CacheLoader<K, Semaphore>() { 
      @Override 
      public Semaphore load(K key) throws Exception { 
       return new Semaphore(1); 
      } 
     }); 

Gibt es irgendwelche Gründe, warum dies nicht ausreichend Nebenläufigkeitssteuerung bieten könnte?

Oder Gründe, warum dies nicht dazu führen kann, dass unbenutzte Paare Müll gesammelt werden?

Antwort

3

Ja, das würde funktionieren. Es gibt auch eine Datenstruktur, die mehr oder weniger für diesen Anwendungsfall entworfen wurde: Striped.

+1

Man sollte beachten, dass 'com.google.common.util.concurrent.Striped' * kein Synchronisationsobjekt pro Schlüssel garantiert. Mehrere Schlüssel dürfen dasselbe Objekt teilen, wodurch die Parallelität verringert werden kann. Als solche kann "Striped" je nach Design/Anwendungsfall eine brauchbare Option sein oder auch nicht. – antak

Verwandte Themen