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

¿Fue útil?

Solución

Guava 's clase CacheBuilder le permite hacer esto fácilmente.

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

Tenga en cuenta que esto cambia la semántica de igualdad clave que deben ser == en lugar de .equals() que no importará en su caso de uso de instancias Class pero es un problema potencial.

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top