Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Aprenda Exemplos de Uso dos Métodos de Coleções | Coleções Sincronizadas
Multithreading em Java

bookExemplos de Uso dos Métodos de Coleções

Note
Nota

Hoje vamos focar principalmente em métodos que auxiliam na criação de coleções thread-safe.

Métodos de Collections

A seguir estão alguns métodos importantes fornecidos pela classe para criar coleções Collections sincronizadas:

synchronizedList(List<T> list): Retorna uma lista sincronizada (segura para threads) que mantém o mesmo contrato da lista fornecida.

Main.java

Main.java

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

synchronizedSet(Set<T> set): Retorna um conjunto sincronizado (seguro para threads) que mantém o mesmo contrato do conjunto fornecido.

Main.java

Main.java

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

synchronizedMap(Map<K, V> m): Retorna um mapa sincronizado (thread-safe) que mantém o mesmo contrato do mapa passado.

Main.java

Main.java

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

unmodifiableList(List<? extends T> list): Retorna uma lista imutável contendo os mesmos elementos da 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): Retorna um mapa imutável contendo os mesmos mapeamentos do 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): Retorna um conjunto imutável contendo os mesmos elementos do 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` } }

Qual é então a diferença entre criar coleções sincronizadas por meio de implementações normais (aquelas discutidas nos capítulos anteriores) e utilizar os métodos da classe Collections?

Veja a diferença utilizando uma coleção Map como exemplo

Diferenças entre ConcurrentHashMap e synchronizedMap()

ConcurrentHashMap utiliza um método avançado chamado divisão de bloqueio (lock splitting), que separa o mapa em segmentos e sincroniza as operações apenas no nível do segmento. Essa abordagem permite que múltiplas threads possam ler e escrever dados simultaneamente em diferentes segmentos do mapa, melhorando a concorrência e o desempenho.

O método synchronizedMap() encapsula o mapa original em um objeto proxy sincronizado. Todos os métodos deste objeto proxy são sincronizados, garantindo a segurança de thread. No entanto, essa abordagem pode reduzir o desempenho em um ambiente multithread devido à alta frequência de bloqueios envolvida.

Por exemplo, se ConcurrentHashMap grava em diferentes buckets, as threads não se bloqueiam mutuamente. No entanto, se um bucket for acessado por 2 threads, uma delas aguardará. Por outro lado, se a coleção for criada via synchronizedMap(), apenas 1 thread terá acesso a todos os buckets, e todo o mapa é bloqueado.

Isso significa que até que uma thread termine seu trabalho, as outras threads não poderão acessar. Como resultado, as operações em ConcurrentHashMap são simplesmente executadas mais rapidamente.

Também existem outros métodos em Collections para trabalho conveniente com coleções:

Note
Nota

A classe Collections fornece métodos convenientes para trabalhar com coleções em Java, simplificando operações comumente utilizadas. Coleções sincronizadas criadas por meio dos métodos da classe Collections são úteis para segurança de thread, mas para tarefas multithread mais complexas, é preferível utilizar coleções do pacote java.util.concurrent.

1. Qual método da classe Collections é utilizado para criar uma lista imutável?

2. Qual dos seguintes métodos da classe Collections retorna um mapa thread-safe?

3. Qual é a diferença entre ConcurrentHashMap e synchronizedMap?

question mark

Qual método da classe Collections é utilizado para criar uma lista imutável?

Select the correct answer

question mark

Qual dos seguintes métodos da classe Collections retorna um mapa thread-safe?

Select the correct answer

question mark

Qual é a diferença entre ConcurrentHashMap e synchronizedMap?

Select the correct answer

Tudo estava claro?

Como podemos melhorá-lo?

Obrigado pelo seu feedback!

Seção 2. Capítulo 8

Pergunte à IA

expand

Pergunte à IA

ChatGPT

Pergunte o que quiser ou experimente uma das perguntas sugeridas para iniciar nosso bate-papo

Suggested prompts:

What are some other useful methods provided by the Collections class?

Can you give examples of when to use synchronizedMap() vs ConcurrentHashMap?

How do unmodifiable collections work in practice?

Awesome!

Completion rate improved to 3.33

bookExemplos de Uso dos Métodos de Coleções

Deslize para mostrar o menu

Note
Nota

Hoje vamos focar principalmente em métodos que auxiliam na criação de coleções thread-safe.

Métodos de Collections

A seguir estão alguns métodos importantes fornecidos pela classe para criar coleções Collections sincronizadas:

synchronizedList(List<T> list): Retorna uma lista sincronizada (segura para threads) que mantém o mesmo contrato da lista fornecida.

Main.java

Main.java

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

synchronizedSet(Set<T> set): Retorna um conjunto sincronizado (seguro para threads) que mantém o mesmo contrato do conjunto fornecido.

Main.java

Main.java

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

synchronizedMap(Map<K, V> m): Retorna um mapa sincronizado (thread-safe) que mantém o mesmo contrato do mapa passado.

Main.java

Main.java

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

unmodifiableList(List<? extends T> list): Retorna uma lista imutável contendo os mesmos elementos da 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): Retorna um mapa imutável contendo os mesmos mapeamentos do 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): Retorna um conjunto imutável contendo os mesmos elementos do 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` } }

Qual é então a diferença entre criar coleções sincronizadas por meio de implementações normais (aquelas discutidas nos capítulos anteriores) e utilizar os métodos da classe Collections?

Veja a diferença utilizando uma coleção Map como exemplo

Diferenças entre ConcurrentHashMap e synchronizedMap()

ConcurrentHashMap utiliza um método avançado chamado divisão de bloqueio (lock splitting), que separa o mapa em segmentos e sincroniza as operações apenas no nível do segmento. Essa abordagem permite que múltiplas threads possam ler e escrever dados simultaneamente em diferentes segmentos do mapa, melhorando a concorrência e o desempenho.

O método synchronizedMap() encapsula o mapa original em um objeto proxy sincronizado. Todos os métodos deste objeto proxy são sincronizados, garantindo a segurança de thread. No entanto, essa abordagem pode reduzir o desempenho em um ambiente multithread devido à alta frequência de bloqueios envolvida.

Por exemplo, se ConcurrentHashMap grava em diferentes buckets, as threads não se bloqueiam mutuamente. No entanto, se um bucket for acessado por 2 threads, uma delas aguardará. Por outro lado, se a coleção for criada via synchronizedMap(), apenas 1 thread terá acesso a todos os buckets, e todo o mapa é bloqueado.

Isso significa que até que uma thread termine seu trabalho, as outras threads não poderão acessar. Como resultado, as operações em ConcurrentHashMap são simplesmente executadas mais rapidamente.

Também existem outros métodos em Collections para trabalho conveniente com coleções:

Note
Nota

A classe Collections fornece métodos convenientes para trabalhar com coleções em Java, simplificando operações comumente utilizadas. Coleções sincronizadas criadas por meio dos métodos da classe Collections são úteis para segurança de thread, mas para tarefas multithread mais complexas, é preferível utilizar coleções do pacote java.util.concurrent.

1. Qual método da classe Collections é utilizado para criar uma lista imutável?

2. Qual dos seguintes métodos da classe Collections retorna um mapa thread-safe?

3. Qual é a diferença entre ConcurrentHashMap e synchronizedMap?

question mark

Qual método da classe Collections é utilizado para criar uma lista imutável?

Select the correct answer

question mark

Qual dos seguintes métodos da classe Collections retorna um mapa thread-safe?

Select the correct answer

question mark

Qual é a diferença entre ConcurrentHashMap e synchronizedMap?

Select the correct answer

Tudo estava claro?

Como podemos melhorá-lo?

Obrigado pelo seu feedback!

Seção 2. Capítulo 8
some-alt