Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Impara Esempi di Utilizzo dei Metodi delle Collezioni | Collezioni Sincronizzate
Multithreading in Java

bookEsempi di Utilizzo dei Metodi delle Collezioni

Note
Nota

Oggi esamineremo principalmente i metodi che aiutano a creare collezioni thread-safe.

Metodi delle Collections

Ecco alcuni metodi importanti forniti dalla classe per creare collezioni Collections sincronizzate:

synchronizedList(List<T> list): Restituisce una lista sincronizzata (thread-safe) che supporta lo stesso contratto della lista passata.

Main.java

Main.java

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

synchronizedSet(Set<T> set): Restituisce un set sincronizzato (thread-safe) che supporta lo stesso contratto del set passato.

Main.java

Main.java

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

synchronizedMap(Map<K, V> m): Restituisce una mappa sincronizzata (thread-safe) che supporta lo stesso contratto della mappa passata.

Main.java

Main.java

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

unmodifiableList(List<? extends T> list): Restituisce una lista immutabile contenente gli stessi elementi della lista specificata.

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): Restituisce una mappa immutabile contenente le stesse associazioni della mappa specificata.

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): Restituisce un set immodificabile contenente gli stessi elementi del set specificato.

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 è quindi la differenza tra la creazione di collezioni sincronizzate tramite implementazioni normali (quelle discusse nei capitoli precedenti) e l'utilizzo dei metodi di Collections?

Analisi della differenza utilizzando una collezione Map come esempio

Differenze tra ConcurrentHashMap e synchronizedMap()

ConcurrentHashMap utilizza una tecnica avanzata chiamata lock splitting, che suddivide la mappa in segmenti e sincronizza le operazioni solo a livello di segmento. Questo approccio consente a più thread di leggere e scrivere dati contemporaneamente su segmenti diversi della mappa, migliorando la concorrenza e le prestazioni.

Il metodo synchronizedMap() incapsula la mappa originale in un oggetto proxy sincronizzato. Tutti i metodi di questo oggetto proxy sono sincronizzati, garantendo la sicurezza dei thread. Tuttavia, questo approccio può ridurre le prestazioni in un ambiente multithread a causa della frequenza elevata di blocco coinvolta.

Ad esempio, se ConcurrentHashMap scrive su diversi bucket, i thread non si bloccano a vicenda. Tuttavia, se un bucket viene accesso da 2 thread, uno di essi attenderà. Al contrario, se la collezione viene creata tramite synchronizedMap(), solo 1 thread avrà accesso a tutti i bucket e l'intera mappa viene bloccata.

Questo significa che finché un thread non termina il proprio lavoro, gli altri thread non potranno accedere. Di conseguenza, le operazioni in ConcurrentHashMap vengono semplicemente eseguite più velocemente.

Inoltre, in Collections sono presenti altri metodi per un utilizzo conveniente delle collezioni:

Note
Nota

La classe Collections fornisce metodi pratici per lavorare con le collezioni in Java, semplificando le operazioni più comuni. Le collezioni sincronizzate create tramite i metodi di Collections sono utili per la sicurezza dei thread, ma per compiti multithread più complessi è preferibile utilizzare le collezioni del pacchetto java.util.concurrent.

1. Quale metodo della classe Collections viene utilizzato per creare una lista immutabile?

2. Quale dei seguenti metodi della classe Collections restituisce una mappa thread-safe?

3. Qual è la differenza tra ConcurrentHashMap e synchronizedMap?

question mark

Quale metodo della classe Collections viene utilizzato per creare una lista immutabile?

Select the correct answer

question mark

Quale dei seguenti metodi della classe Collections restituisce una mappa thread-safe?

Select the correct answer

question mark

Qual è la differenza tra ConcurrentHashMap e synchronizedMap?

Select the correct answer

Tutto è chiaro?

Come possiamo migliorarlo?

Grazie per i tuoi commenti!

Sezione 2. Capitolo 8

Chieda ad AI

expand

Chieda ad AI

ChatGPT

Chieda pure quello che desidera o provi una delle domande suggerite per iniziare la nostra conversazione

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

bookEsempi di Utilizzo dei Metodi delle Collezioni

Scorri per mostrare il menu

Note
Nota

Oggi esamineremo principalmente i metodi che aiutano a creare collezioni thread-safe.

Metodi delle Collections

Ecco alcuni metodi importanti forniti dalla classe per creare collezioni Collections sincronizzate:

synchronizedList(List<T> list): Restituisce una lista sincronizzata (thread-safe) che supporta lo stesso contratto della lista passata.

Main.java

Main.java

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

synchronizedSet(Set<T> set): Restituisce un set sincronizzato (thread-safe) che supporta lo stesso contratto del set passato.

Main.java

Main.java

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

synchronizedMap(Map<K, V> m): Restituisce una mappa sincronizzata (thread-safe) che supporta lo stesso contratto della mappa passata.

Main.java

Main.java

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

unmodifiableList(List<? extends T> list): Restituisce una lista immutabile contenente gli stessi elementi della lista specificata.

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): Restituisce una mappa immutabile contenente le stesse associazioni della mappa specificata.

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): Restituisce un set immodificabile contenente gli stessi elementi del set specificato.

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 è quindi la differenza tra la creazione di collezioni sincronizzate tramite implementazioni normali (quelle discusse nei capitoli precedenti) e l'utilizzo dei metodi di Collections?

Analisi della differenza utilizzando una collezione Map come esempio

Differenze tra ConcurrentHashMap e synchronizedMap()

ConcurrentHashMap utilizza una tecnica avanzata chiamata lock splitting, che suddivide la mappa in segmenti e sincronizza le operazioni solo a livello di segmento. Questo approccio consente a più thread di leggere e scrivere dati contemporaneamente su segmenti diversi della mappa, migliorando la concorrenza e le prestazioni.

Il metodo synchronizedMap() incapsula la mappa originale in un oggetto proxy sincronizzato. Tutti i metodi di questo oggetto proxy sono sincronizzati, garantendo la sicurezza dei thread. Tuttavia, questo approccio può ridurre le prestazioni in un ambiente multithread a causa della frequenza elevata di blocco coinvolta.

Ad esempio, se ConcurrentHashMap scrive su diversi bucket, i thread non si bloccano a vicenda. Tuttavia, se un bucket viene accesso da 2 thread, uno di essi attenderà. Al contrario, se la collezione viene creata tramite synchronizedMap(), solo 1 thread avrà accesso a tutti i bucket e l'intera mappa viene bloccata.

Questo significa che finché un thread non termina il proprio lavoro, gli altri thread non potranno accedere. Di conseguenza, le operazioni in ConcurrentHashMap vengono semplicemente eseguite più velocemente.

Inoltre, in Collections sono presenti altri metodi per un utilizzo conveniente delle collezioni:

Note
Nota

La classe Collections fornisce metodi pratici per lavorare con le collezioni in Java, semplificando le operazioni più comuni. Le collezioni sincronizzate create tramite i metodi di Collections sono utili per la sicurezza dei thread, ma per compiti multithread più complessi è preferibile utilizzare le collezioni del pacchetto java.util.concurrent.

1. Quale metodo della classe Collections viene utilizzato per creare una lista immutabile?

2. Quale dei seguenti metodi della classe Collections restituisce una mappa thread-safe?

3. Qual è la differenza tra ConcurrentHashMap e synchronizedMap?

question mark

Quale metodo della classe Collections viene utilizzato per creare una lista immutabile?

Select the correct answer

question mark

Quale dei seguenti metodi della classe Collections restituisce una mappa thread-safe?

Select the correct answer

question mark

Qual è la differenza tra ConcurrentHashMap e synchronizedMap?

Select the correct answer

Tutto è chiaro?

Come possiamo migliorarlo?

Grazie per i tuoi commenti!

Sezione 2. Capitolo 8
some-alt