Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Leer Voorbeelden van het Gebruik van Collectiemethoden | Gesynchroniseerde Collecties
Multithreading in Java

bookVoorbeelden van het Gebruik van Collectiemethoden

Note
Opmerking

Vandaag bekijken we voornamelijk methoden die helpen bij het maken van thread-veilige collecties.

Collections-methoden

Hier zijn enkele belangrijke methoden die door de klasse worden aangeboden om gesynchroniseerde Collections collecties te maken:

synchronizedList(List<T> list): Geeft een gesynchroniseerde (threadveilige) lijst terug die hetzelfde contract ondersteunt als de opgegeven lijst.

Main.java

Main.java

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

synchronizedSet(Set<T> set): Geeft een gesynchroniseerde (threadveilige) set terug die hetzelfde contract ondersteunt als de opgegeven set.

Main.java

Main.java

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

synchronizedMap(Map<K, V> m): Geeft een gesynchroniseerde (thread-veilige) map terug die hetzelfde contract ondersteunt als de meegegeven map.

Main.java

Main.java

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

unmodifiableList(List<? extends T> list): Geeft een onveranderlijke lijst terug met dezelfde elementen als de opgegeven lijst.

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): Geeft een onveranderlijke map terug met dezelfde toewijzingen als de opgegeven map.

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): Geeft een niet-wijzigbare set terug die dezelfde elementen bevat als de opgegeven set.

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` } }

Wat is dan het verschil tussen het aanmaken van gesynchroniseerde collecties via normale implementaties (zoals besproken in de vorige hoofdstukken) en het gebruik van Collections-methoden?

Bekijk het verschil aan de hand van één Map-collectie als voorbeeld

Verschillen tussen ConcurrentHashMap en synchronizedMap()

ConcurrentHashMap maakt gebruik van een geavanceerde methode genaamd lock splitting, waarbij de map wordt opgedeeld in segmenten en bewerkingen alleen op segmentniveau worden gesynchroniseerd. Deze aanpak maakt het mogelijk dat meerdere threads gelijktijdig gegevens lezen en schrijven in verschillende segmenten van de map, wat de concurrentie en prestaties verbetert.

De methode synchronizedMap() wikkelt de oorspronkelijke map in een gesynchroniseerd proxy-object. Alle methoden van dit proxy-object zijn gesynchroniseerd, wat thread-veiligheid garandeert. Deze aanpak kan echter de prestaties verminderen in een multithreaded omgeving vanwege de hoge frequentie van vergrendeling die hierbij komt kijken.

Bijvoorbeeld, als ConcurrentHashMap naar verschillende buckets schrijft, zullen de threads elkaar niet blokkeren. Echter, als één bucket door 2 threads wordt benaderd, zal één van hen moeten wachten. Aan de andere kant, als de collectie is aangemaakt via synchronizedMap(), krijgt slechts 1 thread toegang tot alle buckets en wordt de gehele map geblokkeerd.

Dit betekent dat totdat één thread zijn werk heeft voltooid, andere threads geen toegang krijgen. Hierdoor worden bewerkingen in ConcurrentHashMap gewoonweg sneller uitgevoerd.

Ook in Collections zijn er andere methoden voor het gemakkelijk werken met collecties:

Note
Opmerking

De klasse Collections biedt handige methoden voor het werken met collecties in Java, waardoor veelgebruikte bewerkingen worden vereenvoudigd. Gesynchroniseerde collecties die via Collections-methoden zijn aangemaakt, zijn nuttig voor threadveiligheid, maar voor meer complexe multithreaded taken is het beter om collecties uit het pakket java.util.concurrent te gebruiken.

1. Welke methode in de klasse Collections wordt gebruikt om een onveranderlijke lijst te maken?

2. Welke van de volgende methoden in de klasse Collections retourneert een thread-veilige map?

3. Wat is het verschil tussen ConcurrentHashMap en synchronizedMap?

question mark

Welke methode in de klasse Collections wordt gebruikt om een onveranderlijke lijst te maken?

Select the correct answer

question mark

Welke van de volgende methoden in de klasse Collections retourneert een thread-veilige map?

Select the correct answer

question mark

Wat is het verschil tussen ConcurrentHashMap en synchronizedMap?

Select the correct answer

Was alles duidelijk?

Hoe kunnen we het verbeteren?

Bedankt voor je feedback!

Sectie 2. Hoofdstuk 8

Vraag AI

expand

Vraag AI

ChatGPT

Vraag wat u wilt of probeer een van de voorgestelde vragen om onze chat te starten.

Awesome!

Completion rate improved to 3.33

bookVoorbeelden van het Gebruik van Collectiemethoden

Veeg om het menu te tonen

Note
Opmerking

Vandaag bekijken we voornamelijk methoden die helpen bij het maken van thread-veilige collecties.

Collections-methoden

Hier zijn enkele belangrijke methoden die door de klasse worden aangeboden om gesynchroniseerde Collections collecties te maken:

synchronizedList(List<T> list): Geeft een gesynchroniseerde (threadveilige) lijst terug die hetzelfde contract ondersteunt als de opgegeven lijst.

Main.java

Main.java

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

synchronizedSet(Set<T> set): Geeft een gesynchroniseerde (threadveilige) set terug die hetzelfde contract ondersteunt als de opgegeven set.

Main.java

Main.java

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

synchronizedMap(Map<K, V> m): Geeft een gesynchroniseerde (thread-veilige) map terug die hetzelfde contract ondersteunt als de meegegeven map.

Main.java

Main.java

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

unmodifiableList(List<? extends T> list): Geeft een onveranderlijke lijst terug met dezelfde elementen als de opgegeven lijst.

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): Geeft een onveranderlijke map terug met dezelfde toewijzingen als de opgegeven map.

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): Geeft een niet-wijzigbare set terug die dezelfde elementen bevat als de opgegeven set.

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` } }

Wat is dan het verschil tussen het aanmaken van gesynchroniseerde collecties via normale implementaties (zoals besproken in de vorige hoofdstukken) en het gebruik van Collections-methoden?

Bekijk het verschil aan de hand van één Map-collectie als voorbeeld

Verschillen tussen ConcurrentHashMap en synchronizedMap()

ConcurrentHashMap maakt gebruik van een geavanceerde methode genaamd lock splitting, waarbij de map wordt opgedeeld in segmenten en bewerkingen alleen op segmentniveau worden gesynchroniseerd. Deze aanpak maakt het mogelijk dat meerdere threads gelijktijdig gegevens lezen en schrijven in verschillende segmenten van de map, wat de concurrentie en prestaties verbetert.

De methode synchronizedMap() wikkelt de oorspronkelijke map in een gesynchroniseerd proxy-object. Alle methoden van dit proxy-object zijn gesynchroniseerd, wat thread-veiligheid garandeert. Deze aanpak kan echter de prestaties verminderen in een multithreaded omgeving vanwege de hoge frequentie van vergrendeling die hierbij komt kijken.

Bijvoorbeeld, als ConcurrentHashMap naar verschillende buckets schrijft, zullen de threads elkaar niet blokkeren. Echter, als één bucket door 2 threads wordt benaderd, zal één van hen moeten wachten. Aan de andere kant, als de collectie is aangemaakt via synchronizedMap(), krijgt slechts 1 thread toegang tot alle buckets en wordt de gehele map geblokkeerd.

Dit betekent dat totdat één thread zijn werk heeft voltooid, andere threads geen toegang krijgen. Hierdoor worden bewerkingen in ConcurrentHashMap gewoonweg sneller uitgevoerd.

Ook in Collections zijn er andere methoden voor het gemakkelijk werken met collecties:

Note
Opmerking

De klasse Collections biedt handige methoden voor het werken met collecties in Java, waardoor veelgebruikte bewerkingen worden vereenvoudigd. Gesynchroniseerde collecties die via Collections-methoden zijn aangemaakt, zijn nuttig voor threadveiligheid, maar voor meer complexe multithreaded taken is het beter om collecties uit het pakket java.util.concurrent te gebruiken.

1. Welke methode in de klasse Collections wordt gebruikt om een onveranderlijke lijst te maken?

2. Welke van de volgende methoden in de klasse Collections retourneert een thread-veilige map?

3. Wat is het verschil tussen ConcurrentHashMap en synchronizedMap?

question mark

Welke methode in de klasse Collections wordt gebruikt om een onveranderlijke lijst te maken?

Select the correct answer

question mark

Welke van de volgende methoden in de klasse Collections retourneert een thread-veilige map?

Select the correct answer

question mark

Wat is het verschil tussen ConcurrentHashMap en synchronizedMap?

Select the correct answer

Was alles duidelijk?

Hoe kunnen we het verbeteren?

Bedankt voor je feedback!

Sectie 2. Hoofdstuk 8
some-alt