Exempel på Användning av Samlingsmetoder
Idag kommer vi främst att titta på metoder som hjälper till att skapa trådsäkra samlingar.
Collections-metoder
Här är några viktiga metoder som tillhandahålls av klassen för att skapa synkroniserade Collections samlingar:
synchronizedList(List<T> list): Returnerar en synkroniserad (trådsäker) lista som stöder samma kontrakt som den angivna listan.
Main.java
1List<Object> listSync = Collections.synchronizedList(new ArrayList<>());
synchronizedSet(Set<T> set): Returnerar en synkroniserad (trådsäker) mängd som stöder samma kontrakt som den angivna mängden.
Main.java
1Set<Object> setSync = Collections.synchronizedSet(new HashSet<>());
synchronizedMap(Map<K, V> m): Returnerar en synkroniserad (trådsäker) map som stöder samma kontrakt som den överförda mappen.
Main.java
1Map<Object, Object> mapSync = Collections.synchronizedMap(new HashMap<>());
unmodifiableList(List<? extends T> list): Returnerar en oföränderlig lista som innehåller samma element som den angivna listan.
Main.java
123456789101112131415package 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): Returnerar en oföränderlig map som innehåller samma kopplingar som den angivna mappen.
Main.java
12345678910111213package 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): Returnerar en oföränderlig mängd som innehåller samma element som den angivna mängden.
Main.java
12345678910111213package 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` } }
Vad är då skillnaden mellan att skapa synkroniserade samlingar genom vanliga implementationer (de som diskuterats i tidigare kapitel) och att använda Collections metoder?
Låt oss titta på skillnaden med en Map-samling som exempel
Skillnader mellan ConcurrentHashMap och synchronizedMap()
ConcurrentHashMap använder en avancerad metod som kallas lock splitting, vilket delar upp mappen i segment och synkroniserar operationer endast på segmentnivå. Denna metod möjliggör att flera trådar samtidigt kan läsa och skriva data i olika segment av mappen, vilket förbättrar samtidighet och prestanda.
Metoden synchronizedMap() omsluter den ursprungliga mappen i ett synkroniserat proxyobjekt. Alla metoder i detta proxyobjekt är synkroniserade, vilket säkerställer trådsäkerhet. Denna metod kan dock minska prestandan i en multitrådad miljö på grund av den höga låsningsfrekvensen som uppstår.
Till exempel, om ConcurrentHashMap skriver till olika buckets, kommer trådarna inte att blockera varandra. Om däremot en bucket används av 2 trådar kommer en av dem att vänta. Om kollektionen däremot skapas via synchronizedMap(), kommer endast 1 tråd att ha åtkomst till alla buckets, och hela mappen blockeras.
Detta innebär att tills en tråd har slutfört sitt arbete, kommer andra trådar inte att kunna komma in. Som ett resultat utförs operationer i ConcurrentHashMap helt enkelt snabbare.
Det finns även andra metoder i Collections för smidigt arbete med kollektioner:
Collections-klassen tillhandahåller praktiska metoder för att arbeta med samlingar i Java, vilket förenklar vanliga operationer. Synkroniserade samlingar som skapas via Collections metoder är användbara för trådsäkerhet, men för mer komplexa multitrådade uppgifter är det bättre att använda samlingar från paketet java.util.concurrent.
1. Vilken metod i klassen Collections används för att skapa en oföränderlig lista?
2. Vilken av följande metoder i klassen Collections returnerar en trådsäker map?
3. Vad är skillnaden mellan ConcurrentHashMap och synchronizedMap?
Tack för dina kommentarer!
Fråga AI
Fråga AI
Fråga vad du vill eller prova någon av de föreslagna frågorna för att starta vårt samtal
Awesome!
Completion rate improved to 3.33
Exempel på Användning av Samlingsmetoder
Svep för att visa menyn
Idag kommer vi främst att titta på metoder som hjälper till att skapa trådsäkra samlingar.
Collections-metoder
Här är några viktiga metoder som tillhandahålls av klassen för att skapa synkroniserade Collections samlingar:
synchronizedList(List<T> list): Returnerar en synkroniserad (trådsäker) lista som stöder samma kontrakt som den angivna listan.
Main.java
1List<Object> listSync = Collections.synchronizedList(new ArrayList<>());
synchronizedSet(Set<T> set): Returnerar en synkroniserad (trådsäker) mängd som stöder samma kontrakt som den angivna mängden.
Main.java
1Set<Object> setSync = Collections.synchronizedSet(new HashSet<>());
synchronizedMap(Map<K, V> m): Returnerar en synkroniserad (trådsäker) map som stöder samma kontrakt som den överförda mappen.
Main.java
1Map<Object, Object> mapSync = Collections.synchronizedMap(new HashMap<>());
unmodifiableList(List<? extends T> list): Returnerar en oföränderlig lista som innehåller samma element som den angivna listan.
Main.java
123456789101112131415package 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): Returnerar en oföränderlig map som innehåller samma kopplingar som den angivna mappen.
Main.java
12345678910111213package 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): Returnerar en oföränderlig mängd som innehåller samma element som den angivna mängden.
Main.java
12345678910111213package 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` } }
Vad är då skillnaden mellan att skapa synkroniserade samlingar genom vanliga implementationer (de som diskuterats i tidigare kapitel) och att använda Collections metoder?
Låt oss titta på skillnaden med en Map-samling som exempel
Skillnader mellan ConcurrentHashMap och synchronizedMap()
ConcurrentHashMap använder en avancerad metod som kallas lock splitting, vilket delar upp mappen i segment och synkroniserar operationer endast på segmentnivå. Denna metod möjliggör att flera trådar samtidigt kan läsa och skriva data i olika segment av mappen, vilket förbättrar samtidighet och prestanda.
Metoden synchronizedMap() omsluter den ursprungliga mappen i ett synkroniserat proxyobjekt. Alla metoder i detta proxyobjekt är synkroniserade, vilket säkerställer trådsäkerhet. Denna metod kan dock minska prestandan i en multitrådad miljö på grund av den höga låsningsfrekvensen som uppstår.
Till exempel, om ConcurrentHashMap skriver till olika buckets, kommer trådarna inte att blockera varandra. Om däremot en bucket används av 2 trådar kommer en av dem att vänta. Om kollektionen däremot skapas via synchronizedMap(), kommer endast 1 tråd att ha åtkomst till alla buckets, och hela mappen blockeras.
Detta innebär att tills en tråd har slutfört sitt arbete, kommer andra trådar inte att kunna komma in. Som ett resultat utförs operationer i ConcurrentHashMap helt enkelt snabbare.
Det finns även andra metoder i Collections för smidigt arbete med kollektioner:
Collections-klassen tillhandahåller praktiska metoder för att arbeta med samlingar i Java, vilket förenklar vanliga operationer. Synkroniserade samlingar som skapas via Collections metoder är användbara för trådsäkerhet, men för mer komplexa multitrådade uppgifter är det bättre att använda samlingar från paketet java.util.concurrent.
1. Vilken metod i klassen Collections används för att skapa en oföränderlig lista?
2. Vilken av följande metoder i klassen Collections returnerar en trådsäker map?
3. Vad är skillnaden mellan ConcurrentHashMap och synchronizedMap?
Tack för dina kommentarer!