El JDK se envía con CopyOnWrite*
implementaciones para Set
y List
, pero ninguna para Map
y a menudo he lamentado este hecho. Sé que hay otras implementaciones de colecciones que los tienen, pero sería bueno si se envía como estándar. Parece una omisión obvia y me pregunto si hubo una buena razón para ello. Alguien tiene alguna idea de por qué esto fue omitido?¿Por qué Java no se envía con un CopyOnWriteMap?
Respuesta
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 algunas 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 en una forma sin cerradura.
Escribir concurrencia:
mejor concurrencia que la copia en colecciones de escritura que, básicamente, serializar actualizaciones (una actualización a la vez). Al usar un mapa hash simultáneo, tiene muchas posibilidades de realizar varias actualizaciones al mismo tiempo. Si sus claves hash están distribuidas uniformemente.
Si haces quieren tener el efecto de una copia en el mapa de escritura, siempre se puede inicializar una ConcurrentHashMap con un nivel de concurrencia 1.
Los dos tipos de colecciones tienen diferentes propósitos. Una colección CopyOnWrite se leerá con mucha más frecuencia que la escrita y, en general, puede evitar la sobrecarga de bloquear las lecturas a expensas de la copia completa en cada escritura infrecuente.ConcurrentHashMap aún requerirá un bloqueo independientemente del valor de concurrencia. – sgargan
Realmente lo que estoy buscando es una implementación de Mapas que se pueda usar de manera muy eficiente en una tabla de búsqueda. Se escribiría con muy poca frecuencia (en la mayoría de los casos, una vez) y se optimizaría para lecturas sin bloqueos. – sgargan
Lea el javadoc para ConcurrentHashMap nuevamente, creo que se adapta a sus necesidades. Aquí hay dos fragmentos de él: "Una tabla hash que admite concurrencia completa de recuperación ..." y "... todas las operaciones son seguras para hilos, las operaciones de recuperación no implican bloqueo ...". Así que sí, es un ajuste perfecto para una tabla de búsqueda concurrente. –
La implementación más sencilla de un conjunto que suele ser el uso de una 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 CopyOnWriteSet siendo 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 Collections.newSetFromMap (ConcurrentHashMap()) aceptable para su uso?
OP pide un mapa, no un conjunto. – eckes
- 1. ¿Por qué mi URLLoader no envía cuando se completa?
- 2. ¿Por qué no se envía Varnish 304 sin modificaciones cuando se envía el encabezado If-Modified-Since?
- 3. ¿Por qué traceroute envía paquetes UDP y no ICMP?
- 4. Java: ¿Por qué no se recoge basura?
- 5. ¿por qué java no envía el certificado del cliente durante el protocolo de enlace SSL?
- 6. ¿Por qué Java SSLSocket envía un cliente de la versión 2 hola?
- 7. jQuery: el formulario no se envía con $ ("# id"). Submit(), pero se enviará con un botón "enviar".
- 8. JQuery jsession cookie no se envía a un servidor
- 9. ¿Por qué no se puede contentar con un estilo?
- 10. ¿Por qué OSX Snow Leopard se envía con GCC 4.2.1 y es posible (¿es aconsejable?) Actualizar?
- 11. ¿Por qué java applets/javafx no se usan ampliamente? (por qué no debería usarlos para RIA)
- 12. Java: ¿Por qué las NullPointerExceptions no se llaman NullReferenceExceptions?
- 13. ¿Por qué no se desaprobó java.io.Serializable en Java 5?
- 14. ¿Por qué no se pueden sincronizar los constructores de Java?
- 15. cómo se envía html con restify
- 16. ¿Cómo se envía una trama Ethernet con un FCS corrupto?
- 17. ¿Por qué este código java genérico no se compilará?
- 18. ¿Por qué no declaro NSInteger con un *
- 19. ¿Por qué no se implementa JML como anotaciones en Java?
- 20. envía un correo electrónico con el enlace
- 21. ¿Por qué no se cuelga?
- 22. ¿Por qué Java se usa con frecuencia para aplicaciones empresariales?
- 23. NSURLRequest no envía cookies
- 24. por qué no hay sizeof en java
- 25. ¿Por qué se genera un código hash de Java String?
- 26. ¿Qué versión de .NET se envía con qué versión de Windows?
- 27. El correo de PHP no se envía, ¿cómo debo depurar?
- 28. ¿Por qué Java varargs no admite colecciones?
- 29. ¿Por qué no se permite System.out.println (super)?
- 30. Java: ¿por qué no puede iterar sobre un iterador?
Mucha gente asume que java.util.Map es una colección, pero no lo es. Esto no está directamente relacionado con tu pregunta, pero algunas de las palabras me hicieron pensar que tal vez habías hecho esta suposición, así que pensé en señalarlo. – pkaeding
De acuerdo, podría no implementar la interfaz de Colección y podríamos argumentar la semántica de qué colección verdadera. Pero el resultado de tales minucias no haría que CopyOnWriteMap fuera menos valioso o perdiera menos. – sgargan
La iteración no es un caso de uso tan común para mapas como para otras colecciones. – msandiford