2011-12-14 12 views
8

¿Se supone que el método ConcurrentHashMap.putAll (Map) es atómico?¿Es "ConcurrentHashMap.putAll (...)" atómico?

No puedo encontrarlo en la documentación y no se menciona en la interfaz de ConcurrentMap, así que supongo que la respuesta es no. Lo estoy pidiendo para estar seguro, ya que no tendría sentido si esa operación no fuera atómica para ser sincera.

Si no es atómico, ¿cuál sería la mejor manera de admitir insertos atómicos de varios elementos? ¿De vuelta al viejo y bien sincronizado?

Respuesta

9

No es atómico, no. Según the class documentation:

Para las operaciones de agregados tales como putAll y clear, recuperaciones concurrentes pueden reflejar la inserción o extracción de solamente algunas entradas.

Para atomicizarlo, tendrá que usar synchronized, sí. No hay forma de no bloqueo para hacer esto.

+0

¿Qué ocurre con otra implementación de mapas concurrente (no estándar)? –

+0

@pst ¿Cuál podría ser un candidato? –

+0

@JaperD. No tengo idea. Me preguntaba si tenía alguna idea, aunque esta respuesta aún está completa sin ella. –

3

en la parte superior de the doc

Para las operaciones de agregados tales como putAll y clear, concurrentes recuperaciones podrían reflejar la inserción o extracción de solamente algunas entradas.

2

putAll() no es atómica, sino que simplemente tiene la garantía de que cada individuo es put() atómica.

2

Para atomicize, usted tendrá que usar sincronizada, sí

No sólo eso: hay que poner un bloque sincronizado en cada método de mapa público de este modo la concurrencia degradantes.

Cuestiones relacionadas