2009-03-27 12 views
6

Fondo rápido Tengo un mapa simultáneo Utilicé para almacenar en caché algunos valores que cambian con bastante frecuencia (aún vale la pena almacenarlas en caché). Deseo expulsar elementos de mi caché a intervalos regulares examinando un tiempo de caducidad en el valor. Estoy utilizando el método keySet() para obtener una referencia a todas mis claves y luego verifico los valores y si caduco, los elimino. En otros hilos, la caché se consulta y actualiza (elimina) constantemente.Pregunta de Java ConcurentMap keySet() cuando se modifica el mapa y se itera sobre el conjunto de claves

De los javadocs para keySet() mencionó si el mapa cambia mientras estoy iterando sobre el conjunto de claves Establecer los resultados no están definidos. Obviamente, me gustaría una forma definida de tratar con esto para que los resultados sean válidos. ¿Sería suficiente pasar el Set a un HashSet y luego iterar sobre este conjunto ya que entiendo que este conjunto no estará respaldado por el mapa? ¿Es esto un desperdicio de memoria? Cualquier idea apreciada.

Desafortunadamente, mi desalojador no es la única forma de eliminar elementos del mapa simultáneo, así que estoy en lo cierto al decir que necesito copiar el conjunto de claves a otro conjunto antes de recorrerlo.

Gracias de antemano

EDIT: Resulta que yo estaba leyendo los javadocs para el método en lugar del conjunto de claves ConcurrentMap() Mapa de conjunto de claves(). Gracias mi mal :)

Devuelve una vista de conjunto de las claves que figuran en este mapa. El conjunto es respaldado por el mapa, por lo que los cambios en el mapa se reflejan en el conjunto y viceversa. Si el mapa se modifica mientras que una iteración sobre el conjunto está en progreso (excepto a través propia operación de eliminación del del iterador), los resultados de la iteración son indefinido. El conjunto admite la eliminación del elemento , que elimina la asignación correspondiente del mapa, a través de Iterator.remove, Set.remove, removeAll retainAll y borra las operaciones . No es compatible con agregar o agregar todas las operaciones.

Respuesta

6

¿Está utilizando the Java Concurrent HashMap? De la documentación de keySet() parece comportarse de una manera que le resultaría útil.

Devuelve una vista de conjunto de las teclas que contiene este mapa. El conjunto está respaldado por el mapa, por lo que los cambios en el mapa se reflejan en el conjunto y viceversa. El conjunto admite la eliminación de elementos, que elimina la asignación correspondiente de este mapa, a través de Iterator.remove, Set.remove, removeAll, retainAll y borra las operaciones. No admite agregar o agregar todas las operaciones. El iterador devuelto de la vista es un iterador "débilmente consistente" que nunca arrojará ConcurrentModificationException, y garantiza que atravesará los elementos tal como existían en la construcción del iterador, y puede (pero no se garantiza que) reflejar cualquier modificación posterior a la construcción.

es decir, puede quitar cosas y debe estar bien.

Si usted no está usando esta aplicación, a continuación, que son usted que usa (y por qué? No ser divertido, pero sería interesante saber por qué usted ha hecho esa elección)

+0

Gran Gracias Brian vosotros soy usando un hashmap concurrente pero al mirar los javadocs estaba leyendo los documentos del mapa :) Gracias un millón –

0

Si un caché LRU le encajaba bastante bien para ti, echa un vistazo a LinkedHashMap -se hace que la implementación de un caché LRU trivial, y entonces usted puede hacer que el resultado threadsafe envolviéndolo con una llamada a Collections.synchronizedMap.

Cuestiones relacionadas