OCP7 11 – Hilos (06) – Colecciones con protección de Thread
30-12-2018 - Xavsal
En general las colecciones de java.util no tienen protección de thread. Para poder utilizar colecciones en modo de protección de thread se debe utilizar uno de los siguientes mecanismos:
- Utilizar bloques de código sincronizado para todos los accesos a una colección si se realizan escrituras.
- Crear un envoltorio sincronizado mediante métodos de biblioteca como
java.util.Collections.synchronizedList(List<T>)
. Es importante destacar que el hecho de que una Collection se cree con protección thread no hace que sus elementos dispongan de la misma protección de thread. - Utilizar colecciones dentro de java.util.concurrent.
Collecciones thread safe
La clase ConcurrentLinkedQueue
proporciona una cola FIFO no bloqueante con protección de thread escalable eficaz.
Adicionalmente existen cinco implementaciones en java.util.concurrent
que también soportan la interfaz ampliada BlockingQueue
que define las versiones de bloqueo de colocación y captura:
Ademas de las colas, este paquete proporciona implementaciones de Collection
diseñadas para su uso en contextos multihilo siguientes:
- ConcurrentHashMap
- ConcurrentSkipListMap
- ConcurrentSkipListSet
- CopyOnWriteArrayList
- CopyOnWriteArraySet
Cuándo se espera que muchos threads accedan a la colección proporcionada, normalmente se prefiere
ConcurrentHashMap
aHashMap
sincronizado.ConcurrentSkipListMap
aTreeMap
sincronizado.
Cuándo el número esperado de lecturas y transversales supera en gran medida el número de actualizaciones en una lista se prefiere
CopyOnWriteArrayList
aArrayList
sincronizado .