Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Aprende Ejemplos de Uso de Métodos de Colecciones | Colecciones Sincronizadas
Multithreading en Java

bookEjemplos de Uso de Métodos de Colecciones

Note
Nota

Hoy nos centraremos principalmente en los métodos que ayudan a crear colecciones seguras para hilos.

Métodos de Collections

A continuación se presentan algunos métodos importantes proporcionados por la clase para crear colecciones Collections sincronizadas:

synchronizedList(List<T> list): Devuelve una lista sincronizada (segura para hilos) que cumple el mismo contrato que la lista proporcionada.

Main.java

Main.java

copy
1
List<Object> listSync = Collections.synchronizedList(new ArrayList<>());

synchronizedSet(Set<T> set): Devuelve un conjunto sincronizado (seguro para hilos) que cumple el mismo contrato que el conjunto proporcionado.

Main.java

Main.java

copy
1
Set<Object> setSync = Collections.synchronizedSet(new HashSet<>());

synchronizedMap(Map<K, V> m): Devuelve un mapa sincronizado (seguro para hilos) que respeta el mismo contrato que el mapa proporcionado.

Main.java

Main.java

copy
1
Map<Object, Object> mapSync = Collections.synchronizedMap(new HashMap<>());

unmodifiableList(List<? extends T> list): Devuelve una lista inmutable que contiene los mismos elementos que la lista especificada.

Main.java

Main.java

copy
123456789101112131415
package com.example; import java.util.Collections; import java.util.List; import java.util.ArrayList; public class Main { public static void main(String[] args) { List<Integer> unmodifiableList = Collections.unmodifiableList(new ArrayList<>(List.of(1,2,3))); System.out.println(unmodifiableList); // output [1,2,3] unmodifiableList.add(4); // throw exception `UnsupportedOperationException` } }

unmodifiableMap(Map<? extends K, ? extends V> m): Devuelve un mapa inmutable que contiene las mismas asociaciones que el mapa especificado.

Main.java

Main.java

copy
12345678910111213
package com.example; import java.util.Collections; import java.util.Map; import java.util.HashMap; public class Main { public static void main(String[] args) { Map<Integer, Integer> unmodifiableMap = Collections.unmodifiableMap(new HashMap<>()); unmodifiableMap.put(1, 2); // exception `UnsupportedOperationException` } }

unmodifiableSet(Set<? extends T> set): Devuelve un conjunto inmodificable que contiene los mismos elementos que el conjunto especificado.

Main.java

Main.java

copy
12345678910111213
package com.example; import java.util.Collections; import java.util.Set; import java.util.HashSet; public class Main { public static void main(String[] args) { Set<Integer> unmodifiableSet = Collections.unmodifiableSet(new HashSet<>()); unmodifiableSet.add(4); // exception `UnsupportedOperationException` } }

¿Cuál es entonces la diferencia entre crear colecciones sincronizadas mediante implementaciones normales (las discutidas en los capítulos anteriores) y utilizar los métodos de Collections?

Analicemos la diferencia utilizando una colección Map como ejemplo

Diferencias entre ConcurrentHashMap y synchronizedMap()

ConcurrentHashMap utiliza un método avanzado conocido como división de bloqueo (lock splitting), que divide el mapa en segmentos y sincroniza las operaciones solo a nivel de segmento. Este enfoque permite que múltiples hilos puedan leer y escribir datos simultáneamente en diferentes segmentos del mapa, mejorando la concurrencia y el rendimiento.

El método synchronizedMap() envuelve el mapa original en un objeto proxy sincronizado. Todos los métodos de este objeto proxy están sincronizados, lo que garantiza la seguridad en el acceso concurrente. Sin embargo, este enfoque puede reducir el rendimiento en un entorno multihilo debido a la alta frecuencia de bloqueos involucrada.

Por ejemplo, si ConcurrentHashMap escribe en diferentes buckets, los hilos no se bloquearán entre sí. Sin embargo, si un bucket es accedido por 2 hilos, uno de ellos esperará. Por otro lado, si la colección se crea mediante synchronizedMap(), solo 1 hilo tendrá acceso a todos los buckets, y todo el mapa estará bloqueado.

Esto significa que hasta que un hilo termine su trabajo, los demás hilos no podrán ingresar. Como resultado, las operaciones en ConcurrentHashMap simplemente se ejecutan más rápido.

Además, en Collections existen otros métodos para un trabajo conveniente con colecciones:

Note
Nota

La clase Collections proporciona métodos convenientes para trabajar con colecciones en Java, simplificando operaciones de uso común. Las colecciones sincronizadas creadas mediante los métodos de Collections son útiles para la seguridad en hilos, pero para tareas multihilo más complejas, es preferible utilizar colecciones del paquete java.util.concurrent.

1. ¿Qué método de la clase Collections se utiliza para crear una lista inmutable?

2. ¿Cuál de los siguientes métodos de la clase Collections devuelve un mapa seguro para hilos?

3. ¿Cuál es la diferencia entre ConcurrentHashMap y synchronizedMap?

question mark

¿Qué método de la clase Collections se utiliza para crear una lista inmutable?

Select the correct answer

question mark

¿Cuál de los siguientes métodos de la clase Collections devuelve un mapa seguro para hilos?

Select the correct answer

question mark

¿Cuál es la diferencia entre ConcurrentHashMap y synchronizedMap?

Select the correct answer

¿Todo estuvo claro?

¿Cómo podemos mejorarlo?

¡Gracias por tus comentarios!

Sección 2. Capítulo 8

Pregunte a AI

expand

Pregunte a AI

ChatGPT

Pregunte lo que quiera o pruebe una de las preguntas sugeridas para comenzar nuestra charla

Awesome!

Completion rate improved to 3.33

bookEjemplos de Uso de Métodos de Colecciones

Desliza para mostrar el menú

Note
Nota

Hoy nos centraremos principalmente en los métodos que ayudan a crear colecciones seguras para hilos.

Métodos de Collections

A continuación se presentan algunos métodos importantes proporcionados por la clase para crear colecciones Collections sincronizadas:

synchronizedList(List<T> list): Devuelve una lista sincronizada (segura para hilos) que cumple el mismo contrato que la lista proporcionada.

Main.java

Main.java

copy
1
List<Object> listSync = Collections.synchronizedList(new ArrayList<>());

synchronizedSet(Set<T> set): Devuelve un conjunto sincronizado (seguro para hilos) que cumple el mismo contrato que el conjunto proporcionado.

Main.java

Main.java

copy
1
Set<Object> setSync = Collections.synchronizedSet(new HashSet<>());

synchronizedMap(Map<K, V> m): Devuelve un mapa sincronizado (seguro para hilos) que respeta el mismo contrato que el mapa proporcionado.

Main.java

Main.java

copy
1
Map<Object, Object> mapSync = Collections.synchronizedMap(new HashMap<>());

unmodifiableList(List<? extends T> list): Devuelve una lista inmutable que contiene los mismos elementos que la lista especificada.

Main.java

Main.java

copy
123456789101112131415
package com.example; import java.util.Collections; import java.util.List; import java.util.ArrayList; public class Main { public static void main(String[] args) { List<Integer> unmodifiableList = Collections.unmodifiableList(new ArrayList<>(List.of(1,2,3))); System.out.println(unmodifiableList); // output [1,2,3] unmodifiableList.add(4); // throw exception `UnsupportedOperationException` } }

unmodifiableMap(Map<? extends K, ? extends V> m): Devuelve un mapa inmutable que contiene las mismas asociaciones que el mapa especificado.

Main.java

Main.java

copy
12345678910111213
package com.example; import java.util.Collections; import java.util.Map; import java.util.HashMap; public class Main { public static void main(String[] args) { Map<Integer, Integer> unmodifiableMap = Collections.unmodifiableMap(new HashMap<>()); unmodifiableMap.put(1, 2); // exception `UnsupportedOperationException` } }

unmodifiableSet(Set<? extends T> set): Devuelve un conjunto inmodificable que contiene los mismos elementos que el conjunto especificado.

Main.java

Main.java

copy
12345678910111213
package com.example; import java.util.Collections; import java.util.Set; import java.util.HashSet; public class Main { public static void main(String[] args) { Set<Integer> unmodifiableSet = Collections.unmodifiableSet(new HashSet<>()); unmodifiableSet.add(4); // exception `UnsupportedOperationException` } }

¿Cuál es entonces la diferencia entre crear colecciones sincronizadas mediante implementaciones normales (las discutidas en los capítulos anteriores) y utilizar los métodos de Collections?

Analicemos la diferencia utilizando una colección Map como ejemplo

Diferencias entre ConcurrentHashMap y synchronizedMap()

ConcurrentHashMap utiliza un método avanzado conocido como división de bloqueo (lock splitting), que divide el mapa en segmentos y sincroniza las operaciones solo a nivel de segmento. Este enfoque permite que múltiples hilos puedan leer y escribir datos simultáneamente en diferentes segmentos del mapa, mejorando la concurrencia y el rendimiento.

El método synchronizedMap() envuelve el mapa original en un objeto proxy sincronizado. Todos los métodos de este objeto proxy están sincronizados, lo que garantiza la seguridad en el acceso concurrente. Sin embargo, este enfoque puede reducir el rendimiento en un entorno multihilo debido a la alta frecuencia de bloqueos involucrada.

Por ejemplo, si ConcurrentHashMap escribe en diferentes buckets, los hilos no se bloquearán entre sí. Sin embargo, si un bucket es accedido por 2 hilos, uno de ellos esperará. Por otro lado, si la colección se crea mediante synchronizedMap(), solo 1 hilo tendrá acceso a todos los buckets, y todo el mapa estará bloqueado.

Esto significa que hasta que un hilo termine su trabajo, los demás hilos no podrán ingresar. Como resultado, las operaciones en ConcurrentHashMap simplemente se ejecutan más rápido.

Además, en Collections existen otros métodos para un trabajo conveniente con colecciones:

Note
Nota

La clase Collections proporciona métodos convenientes para trabajar con colecciones en Java, simplificando operaciones de uso común. Las colecciones sincronizadas creadas mediante los métodos de Collections son útiles para la seguridad en hilos, pero para tareas multihilo más complejas, es preferible utilizar colecciones del paquete java.util.concurrent.

1. ¿Qué método de la clase Collections se utiliza para crear una lista inmutable?

2. ¿Cuál de los siguientes métodos de la clase Collections devuelve un mapa seguro para hilos?

3. ¿Cuál es la diferencia entre ConcurrentHashMap y synchronizedMap?

question mark

¿Qué método de la clase Collections se utiliza para crear una lista inmutable?

Select the correct answer

question mark

¿Cuál de los siguientes métodos de la clase Collections devuelve un mapa seguro para hilos?

Select the correct answer

question mark

¿Cuál es la diferencia entre ConcurrentHashMap y synchronizedMap?

Select the correct answer

¿Todo estuvo claro?

¿Cómo podemos mejorarlo?

¡Gracias por tus comentarios!

Sección 2. Capítulo 8
some-alt