2010-09-01 21 views
5

He leído muchas personas que realmente les gusta el MapMaker de Google Guava (Colecciones), sin embargo, no puedo ver ningún buen uso de la misma.¿Puede alguien explicarme cuándo es útil usar MapMaker o WeakHashMaps?

He leído el javadoc, y dice que se comporta como ConcurrentHashMap. También dice new MapMaker().weakKeys().makeMap() casi siempre se puede utilizar como un reemplazo directo para WeakHashMap.

Sin embargo, leyendo los javadocs de ConcurrentHashMap y WeakHashMap me pregunto cuándo es útil usarlo? Me parece que no puedes tener una garantía de que lo que sea que pongas en el mapa estará allí, o he entendido mal.

Respuesta

6

... y ese es el objetivo. Las referencias débiles son útiles, si no desea (o no puede permitirse) retener un objeto indefinidamente en la memoria. Considere el siguiente caso de uso: necesita asociar información con clases. Ahora, dado que se está ejecutando en un entorno, donde las clases pueden volver a cargarse (por ejemplo, un entorno Tomcat u OSGi), quiere que el recolector de basura pueda recuperar versiones antiguas de una clase tan pronto como lo considere seguro. .

Un primer intento de implementar esto, podría parecer

class ClassAssoc { 
    private final IdentityHashMap<Class<?>,MyMetaData> cache = new ...; 
} 

El problema aquí es: esto sería mantener a todas las clases en el miembro cache siempre (o al menos, a no ser que se retiran manualmente), obligando al recolector de basura para retenerlos indefinidamente, incluido todo lo que se hace referencia de la clase (valores de miembros estáticos, información del cargador de clases, ...)

Al usar referencias débiles, el recolector de basura puede reclamar la versión anterior de la clase tan pronto como ninguna otra las referencias a él (generalmente instancias) existen. Por otro lado, mientras existan tales referencias, se garantiza que el valor también será accesible desde el objeto de referencia débil, y por lo tanto, es una clave válida en la tabla de caché.

Añadir concurrencia y otras atrocidades a la imagen, y estás en lo MapMaker proporciona opcionalmente también ...

0

A WeakHashmap La entrada se mantendrá en el mapa mientras que alguien (que no sea el mapa) hace referencia a la entrada. Si nadie más que el mapa está manteniendo una referencia en la entrada, entonces la entrada se puede eliminar en una próxima ejecución de GC.

-2

ConcurrentHashMap es una Map que puede ser utilizado con seguridad en un entorno multi-threading. Es mejor que la versión sincronizada de Map normal porque concurrencia significa que a menudo hay diferentes subprocesos disponibles para acceder a este mapa sin bloquear.

+0

¿Cómo funciona la pregunta? – whiskeysierra

7

Lo que pasa con MapMaker es que hay muchas opciones para el tipo de mapa que construyes, lo que permite que esos mapas sirvan para muchos propósitos.

  • Dirk es un buen ejemplo de uso de teclas débiles.
  • Los valores programables son útiles para el almacenamiento en caché, ya que puede almacenar valores en el mapa sin preocuparse por quedarse sin memoria, ya que el sistema puede expulsar entradas de la memoria caché si necesita memoria.
  • Puede elegir que las entradas caduquen después de un cierto período de tiempo. Esto también es útil para el almacenamiento en caché, ya que es posible que desee almacenar ciertos datos en caché durante un período de tiempo específico antes de realizar una operación costosa para actualizarlo.
  • Una de mis cosas favoritas es hacer un mapa informático. Un mapa informático utiliza un Function<K, V> para recuperar automáticamente el valor asociado con una tecla dada si aún no está en el mapa. Esto combina bien con valores suaves y/o tiempos de caducidad. Después de que el mapa desaloje una entrada (debido a la demanda o caducidad de la memoria), la próxima vez que se solicite el valor asociado con esa clave, se recuperará automáticamente y se almacenará en caché en el mapa una vez más.
+0

Desearía poder aceptar dos respuestas ya que tu también es útil –

Cuestiones relacionadas