it-swarm.com.de

Gibt es eine Java.util.concurrent-Entsprechung für WeakHashMap?

Kann der folgende Teil des Codes ohne Verwendung von Collections.synchronizedMap() umgeschrieben werden, wobei die Richtigkeit bei gleichzeitiger Verwendung beibehalten wird?

Collections.synchronizedMap(new WeakHashMap<Class, Object>());

gibt es etwas aus Java.util.concurrent, das man stattdessen verwenden kann? Beachten Sie, dass nur durch ersetzen

new ConcurrentHashMap<Class, Object>(new WeakHashMap<Class, Object>()));

offensichtlich wird nicht funktionieren

44
Nikita

Guava s CacheBuilder class ermöglicht es Ihnen, dies einfach zu tun.

CacheBuilder.newBuilder().weakKeys().build()

Beachten Sie, dass hierdurch die Semantik der Schlüsselgleichheit in == anstelle von .equals() geändert wird. Dies spielt bei der Verwendung von Class -Instanzen keine Rolle, ist jedoch eine potenzielle Gefahr.

35

Ich glaube nicht, dass es das gibt. Tatsächlich schlägt das Javadoc vor, Collections.synchronizedMap () zu verwenden.

"Wie die meisten Auflistungsklassen ist diese Klasse nicht synchronisiert. Eine synchronisierte WeakHashMap kann mit der Collections.synchronizedMap-Methode erstellt werden."

19
objects

Cafeine ist ein beliebter Konkurrent von Guava Cache.

- keys automatically wrapped in weak references
- values automatically wrapped in weak or soft references

verwendungszweck:

LoadingCache<Key, Graph> graphs = Caffeine.newBuilder()
 .weakKeys()
 .weakValues()
 .build(key -> createExpensiveGraph(key));
1

Funktioniert das Einschließen der WeakHashMap in eine synchronisierte Karte immer noch ordnungsgemäß, da der Garbage Collector die Schwachstellen jederzeit direkt unter Umgehung der synchronisierten Kartenverpackung ändern kann? Ich denke, WeakHashMap funktioniert wirklich nur in einem Single-Thread-Modell.

Wie oben erwähnt, heißt es in der Dokumentation zu WeakHashMap unter https://docs.Oracle.com/javase/7/docs/api/Java/util/WeakHashMap.html insbesondere:

Eine synchronisierte WeakHashMap kann unter Verwendung der Collections.synchronizedMap-Methode erstellt werden.

Was für mich bedeutet, dass diese Technik mit dem Verhalten des Garbage Collectors zusammenarbeiten muss (es sei denn, die Dokumentation ist fehlerhaft!)

0
Slim Duiker

Wenn Sie Java 7 oder höher verwenden, wird dieser Anwendungsfall threadsicher mit ClassValuehttps://docs.Oracle.com/javase/7/docs/api/Java/lang/ClassValue.html gelöst Wenn Sie die Verwendung von remove benötigen, denken Sie über Parallelität nach und lesen Sie das Dokument gründlich durch.

Wenn Sie Java 6 oder niedriger verwenden. Nein, Sie müssen eine WeakHashMap synchronisieren.

0
Scott Carey