java collections guava java.util.concurrent weakhashmap

¿Existe el equivalente java.util.concurrent para WeakHashMap?



collections guava (5)

¿El ajuste de WeakHashMap en un mapa sincronizado aún funciona correctamente para lo que desea hacer, ya que el recolector de elementos no utilizados puede modificar las referencias débiles directamente en cualquier momento, sin pasar por el contenedor de mapas sincronizados? Creo que WeakHashMap solo funciona realmente en un único modelo de subprocesos.

Como se mencionó anteriormente, la documentación de WeakHashMap en https://docs.oracle.com/javase/7/docs/api/java/util/WeakHashMap.html dice específicamente:

"Se puede construir un WeakHashMap sincronizado utilizando el método Collections.synchronizedMap"

Lo que implica para mí que esta técnica debe funcionar en conjunto con el comportamiento del recolector de basura (¡a menos que la documentación tenga errores!)

¿Se puede reescribir la siguiente pieza de código sin usar Collections.synchronizedMap() pero manteniendo la corrección en concurrencia?

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

es decir, ¿hay algo de java.util.concurrent que se pueda usar en su lugar? Tenga en cuenta que simplemente reemplazando con

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

obviamente no funcionará


¿El ajuste de WeakHashMap en un mapa sincronizado aún funciona correctamente para lo que desea hacer, ya que el recolector de elementos no utilizados puede modificar las referencias débiles directamente en cualquier momento, sin pasar por el contenedor de mapas sincronizados? Creo que WeakHashMap solo funciona realmente en un único modelo de subprocesos.


La clase CacheBuilder de Guava te permite hacer esto fácilmente.

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

Tenga en cuenta que esto cambia la semántica de igualdad de claves para que sea == lugar de .equals() lo que no importará en su caso de usar instancias de Class , pero es una trampa potencial.


Yo no creo que exista. De hecho, javadoc sugiere usar Collections.synchronizedMap ()

"Como la mayoría de las clases de recopilación, esta clase no está sincronizada. Se puede construir un WeakHashMap sincronizado utilizando el método Collections.synchronizedMap".


Cafeine es un competidor popular de la memoria caché de Guava.

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

uso:

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