¿Hay equivalente java.util.concurrent para WeakHashMap?
-
20-09-2019 - |
Pregunta
¿Puede el siguiente fragmento de código puede reescribir w / o usando Collections.synchronizedMap()
pero manteniendo la corrección en concurrencia?
Collections.synchronizedMap(new WeakHashMap<Class, Object>());
es decir. ¿hay algo de uno java.util.concurrent puede usar en su lugar? Tenga en cuenta que la simple sustitución con
new ConcurrentHashMap<Class, Object>(new WeakHashMap<Class, Object>()));
obviamente, no va a funcionar
Solución
Otros consejos
No creo que hay. De hecho, el javadoc sugiere el uso de Collections.synchronizedMap ()
"Como la mayoría de las clases de colección, esta clase no está sincronizado. A WeakHashMap sincronizado puede construirse usando el método Collections.synchronizedMap."
Cafeine es un competidor popular de caché de guayaba.
- 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));
¿El envolviendo el WeakHashMap en un mapa sincronizada todavía funciona correctamente para lo que quieres hacer, ya que el recolector de basura modificar los WeakReferences directamente en cualquier momento, sin pasar por el sincronizada envoltorio mapa? Creo WeakHashMap único verdaderamente trabaja en una modelo de un solo subproceso.
Como se mencionó anteriormente, la documentación para WeakHashMap en https://docs.oracle.com/javase/7/docs/api/java/util/WeakHashMap.html específicamente dice:
"A WeakHashMap sincronizado puede construirse usando el método Collections.synchronizedMap "
Lo que implica para mí que esta técnica debe trabajar en conjunto con el comportamiento del recolector de basura (a menos que la documentación está libre de errores!)
Si está utilizando Java 7 y por encima, este caso de uso se resuelve de una manera segura para los subprocesos con ClassValue
https://docs.oracle.com/javase/7/docs/api/java/lang/ClassValue.html Si requiere el uso de remove
, pensar cuidadosamente acerca de la concurrencia y leer el documento completo.
Si está utilizando Java 6 o por debajo. No, usted tiene que sincronizar un WeakHashMap.
¿El envolviendo el WeakHashMap en un mapa sincronizada todavía funcionan correctamente para lo que quieres hacer, ya que el recolector de basura puede modificar los WeakReferences directamente en cualquier momento, sin pasar por la envoltura mapa sincronizada? Creo WeakHashMap único verdaderamente funciona en un único modelo roscado.