2010-11-17 16 views
6

Tenemos un servidor Scala que está obteniendo un árbol de nodos usando Buffers de Protocolo sobre un socket y necesitamos adjuntar datos adicionales a cada nodo.Guava MapMaker(). WeakKeys(). MakeMap() vs WeakHashMap

En un contexto de subproceso único y cuando tanto el árbol de nodos como los datos asociados tendrán sus fuertes referencias eliminadas al mismo tiempo (debido a salir del alcance), ¿hay alguna razón para usar MapMaker de Google Guava con weakKeys () sobre el uso de WeakHashMap? Parece que con MapMaker, uno paga por el acceso sincronizado, que no es necesario en este caso.

Como comentario adicional, sería útil que MapMaker permitiera el acceso a las configuraciones de equivalencia para poder elegir la igualdad de referencia pero sin importar las referencias débiles o débiles.

Respuesta

6

Una desventaja significativa de WeakHashMap es que no es un "mapa de identidad". Es decir, usa equals() y hashCode (en lugar de == y identityHashCode) en las teclas, lo que realmente no tiene sentido para las teclas débiles. Puede solucionar este error asegurándose de que sus claves usan igualdad de identidad en su método equals.

+0

Gracias Laurence, escaneé rápidamente el Javadoc y asumí que se implementaría usando == y identityHashCode, pero leer más de cerca coincide con su descripción. –

+0

Además, todavía se puede usar java.util.HashMap y escribir una ReferenceEquivalence personalizada que contenga una T única y use == y identityHashCode? –

+0

Podrías, pero necesitarás algo para purgar las llaves muertas del 'HashMap'. Por otro lado, no he verificado esto mirando el código, pero me pregunto si la eliminación de claves/valores muertos es parte de la razón por la que 'MapMaker' usa' ConcurrentMap'. –