getcontentpane componentes java collections map concurrency concurrenthashmap

componentes - ¿Por qué Java no se envía con un CopyOnWriteMap?



jpanel (2)

El JDK se envía con implementaciones CopyOnWrite* para Set y List , pero ninguna para Map y muchas veces he lamentado este hecho. Sé que hay otras implementaciones de colecciones que las tienen, pero sería bueno si se enviaran como estándar. Parece una omisión obvia y me pregunto si había una buena razón para ello. ¿Alguien tiene alguna idea de por qué se dejó esto?


La implementación más fácil de un conjunto usualmente sería usar un mapa subyacente. Incluso tienen un método Collections.newSetFromMap () [quizás solo desde 1.6].

Lo que deberían haber hecho es tener un CopyOnWriteMap y que el CopyOnWriteSet sea equivalente a Collections.newSetFromMap (new CopyOnWriteMap ()).

Pero como puede ver, el CopyOnWriteArraySet está respaldado por una matriz, no por un mapa. ¿Y no sería aceptable para tu caso de uso Collections.newSetFromMap (ConcurrentHashMap ()) ?


Supongo que esto depende de su caso de uso, pero ¿por qué necesitaría un CopyOnWriteMap cuando ya tiene un ConcurrentHashMap ?

Para una tabla de búsqueda simple con muchos lectores y solo una o pocas actualizaciones es una buena opción.

En comparación con una copia en la colección de escritura:

Leer concurrencia:

Igual a una copia en la colección de escritura. Varios lectores pueden recuperar elementos del mapa al mismo tiempo sin bloqueo .

Escribir concurrencia:

Mejor concurrencia que la copia en las colecciones de escritura que básicamente serializan actualizaciones (una actualización a la vez). Al usar un mapa hash concurrente, tiene muchas posibilidades de hacer varias actualizaciones al mismo tiempo. Si sus claves hash están distribuidas uniformemente.

Si desea tener el efecto de una copia en el mapa de escritura, siempre puede inicializar un ConcurrentHashMap con un nivel de concurrencia de 1.