Приклади Використання Методів Колекцій
Сьогодні ми переважно розглянемо методи, які допомагають створювати потокобезпечні колекції.
Методи Collections
Нижче наведено деякі важливі методи, які надає клас для створення синхронізованих колекцій Collections
:
synchronizedList(List<T> list)
: Повертає синхронізований (потокобезпечний) список, який підтримує той самий контракт, що й переданий список.
Main.java
1List<Object> listSync = Collections.synchronizedList(new ArrayList<>());
synchronizedSet(Set<T> set)
: Повертає синхронізовану (потокобезпечну) множину, яка підтримує той самий контракт, що й передана множина.
Main.java
1Set<Object> setSync = Collections.synchronizedSet(new HashSet<>());
synchronizedMap(Map<K, V> m)
: Повертає синхронізовану (потокобезпечну) мапу, яка підтримує той самий контракт, що й передана мапа.
Main.java
1Map<Object, Object> mapSync = Collections.synchronizedMap(new HashMap<>());
unmodifiableList(List<? extends T> list)
: Повертає незмінний список, що містить ті самі елементи, що й вказаний список.
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)
: Повертає незмінну мапу, що містить ті самі відображення, що й вказана мапа.
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)
: Повертає незмінну множину, що містить ті самі елементи, що й задана множина.
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` } }
У чому ж полягає різниця між створенням синхронізованих колекцій за допомогою звичайних реалізацій (розглянутих у попередніх розділах) та використанням методів класу Collections
?
Розглянемо різницю на прикладі однієї колекції типу Map
Відмінності між ConcurrentHashMap та synchronizedMap()
ConcurrentHashMap
використовує сучасний підхід, відомий як розділення блокувань (lock splitting), який ділить мапу на сегменти та синхронізує операції лише на рівні окремих сегментів. Такий підхід дозволяє декільком потокам одночасно зчитувати та записувати дані у різні сегменти мапи, що підвищує конкурентність та продуктивність.
Метод synchronizedMap()
обгортає оригінальну мапу у синхронізований проксі-об'єкт. Усі методи цього проксі-об'єкта синхронізовані, що забезпечує потокобезпечність. Однак цей підхід може знижувати продуктивність у багатопотоковому середовищі через високу частоту блокувань.
Наприклад, якщо ConcurrentHashMap
записує у різні бакети, потоки не блокують один одного. Однак, якщо до одного бакету звертаються 2 потоки, один з них чекатиме. З іншого боку, якщо колекція створена через synchronizedMap()
, лише 1 потік матиме доступ до всіх бакетів, і вся мапа блокується.
Це означає, що поки один потік не завершить свою роботу, інші потоки не зможуть увійти. У результаті операції в ConcurrentHashMap
виконуються просто швидше.
Також у Collections є інші методи для зручної роботи з колекціями:
Клас Collections
надає зручні методи для роботи з колекціями у Java, спрощуючи виконання поширених операцій. Синхронізовані колекції, створені за допомогою методів Collections
, корисні для потокобезпечності, але для більш складних багатопотокових задач краще використовувати колекції з пакету java.util.concurrent
.
1. Який метод класу Collections використовується для створення незмінного списку?
2. Який із наведених методів класу Collections
повертає потокобезпечну мапу?
3. У чому різниця між ConcurrentHashMap та synchronizedMap?
Дякуємо за ваш відгук!
Запитати АІ
Запитати АІ
Запитайте про що завгодно або спробуйте одне із запропонованих запитань, щоб почати наш чат
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
Приклади Використання Методів Колекцій
Свайпніть щоб показати меню
Сьогодні ми переважно розглянемо методи, які допомагають створювати потокобезпечні колекції.
Методи Collections
Нижче наведено деякі важливі методи, які надає клас для створення синхронізованих колекцій Collections
:
synchronizedList(List<T> list)
: Повертає синхронізований (потокобезпечний) список, який підтримує той самий контракт, що й переданий список.
Main.java
1List<Object> listSync = Collections.synchronizedList(new ArrayList<>());
synchronizedSet(Set<T> set)
: Повертає синхронізовану (потокобезпечну) множину, яка підтримує той самий контракт, що й передана множина.
Main.java
1Set<Object> setSync = Collections.synchronizedSet(new HashSet<>());
synchronizedMap(Map<K, V> m)
: Повертає синхронізовану (потокобезпечну) мапу, яка підтримує той самий контракт, що й передана мапа.
Main.java
1Map<Object, Object> mapSync = Collections.synchronizedMap(new HashMap<>());
unmodifiableList(List<? extends T> list)
: Повертає незмінний список, що містить ті самі елементи, що й вказаний список.
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)
: Повертає незмінну мапу, що містить ті самі відображення, що й вказана мапа.
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)
: Повертає незмінну множину, що містить ті самі елементи, що й задана множина.
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` } }
У чому ж полягає різниця між створенням синхронізованих колекцій за допомогою звичайних реалізацій (розглянутих у попередніх розділах) та використанням методів класу Collections
?
Розглянемо різницю на прикладі однієї колекції типу Map
Відмінності між ConcurrentHashMap та synchronizedMap()
ConcurrentHashMap
використовує сучасний підхід, відомий як розділення блокувань (lock splitting), який ділить мапу на сегменти та синхронізує операції лише на рівні окремих сегментів. Такий підхід дозволяє декільком потокам одночасно зчитувати та записувати дані у різні сегменти мапи, що підвищує конкурентність та продуктивність.
Метод synchronizedMap()
обгортає оригінальну мапу у синхронізований проксі-об'єкт. Усі методи цього проксі-об'єкта синхронізовані, що забезпечує потокобезпечність. Однак цей підхід може знижувати продуктивність у багатопотоковому середовищі через високу частоту блокувань.
Наприклад, якщо ConcurrentHashMap
записує у різні бакети, потоки не блокують один одного. Однак, якщо до одного бакету звертаються 2 потоки, один з них чекатиме. З іншого боку, якщо колекція створена через synchronizedMap()
, лише 1 потік матиме доступ до всіх бакетів, і вся мапа блокується.
Це означає, що поки один потік не завершить свою роботу, інші потоки не зможуть увійти. У результаті операції в ConcurrentHashMap
виконуються просто швидше.
Також у Collections є інші методи для зручної роботи з колекціями:
Клас Collections
надає зручні методи для роботи з колекціями у Java, спрощуючи виконання поширених операцій. Синхронізовані колекції, створені за допомогою методів Collections
, корисні для потокобезпечності, але для більш складних багатопотокових задач краще використовувати колекції з пакету java.util.concurrent
.
1. Який метод класу Collections використовується для створення незмінного списку?
2. Який із наведених методів класу Collections
повертає потокобезпечну мапу?
3. У чому різниця між ConcurrentHashMap та synchronizedMap?
Дякуємо за ваш відгук!