Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Вивчайте Приклади Використання Методів Колекцій | Синхронізовані Колекції
Багатопотоковість у Java

bookПриклади Використання Методів Колекцій

Note
Примітка

Сьогодні ми переважно розглянемо методи, які допомагають створювати потокобезпечні колекції.

Методи Collections

Нижче наведено деякі важливі методи, які надає клас для створення синхронізованих колекцій Collections:

synchronizedList(List<T> list): Повертає синхронізований (потокобезпечний) список, який підтримує той самий контракт, що й переданий список.

Main.java

Main.java

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

synchronizedSet(Set<T> set): Повертає синхронізовану (потокобезпечну) множину, яка підтримує той самий контракт, що й передана множина.

Main.java

Main.java

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

synchronizedMap(Map<K, V> m): Повертає синхронізовану (потокобезпечну) мапу, яка підтримує той самий контракт, що й передана мапа.

Main.java

Main.java

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

unmodifiableList(List<? extends T> list): Повертає незмінний список, що містить ті самі елементи, що й вказаний список.

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): Повертає незмінну мапу, що містить ті самі відображення, що й вказана мапа.

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): Повертає незмінну множину, що містить ті самі елементи, що й задана множина.

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

У чому ж полягає різниця між створенням синхронізованих колекцій за допомогою звичайних реалізацій (розглянутих у попередніх розділах) та використанням методів класу Collections?

Розглянемо різницю на прикладі однієї колекції типу Map

Відмінності між ConcurrentHashMap та synchronizedMap()

ConcurrentHashMap використовує сучасний підхід, відомий як розділення блокувань (lock splitting), який ділить мапу на сегменти та синхронізує операції лише на рівні окремих сегментів. Такий підхід дозволяє декільком потокам одночасно зчитувати та записувати дані у різні сегменти мапи, що підвищує конкурентність та продуктивність.

Метод synchronizedMap() обгортає оригінальну мапу у синхронізований проксі-об'єкт. Усі методи цього проксі-об'єкта синхронізовані, що забезпечує потокобезпечність. Однак цей підхід може знижувати продуктивність у багатопотоковому середовищі через високу частоту блокувань.

Наприклад, якщо ConcurrentHashMap записує у різні бакети, потоки не блокують один одного. Однак, якщо до одного бакету звертаються 2 потоки, один з них чекатиме. З іншого боку, якщо колекція створена через synchronizedMap(), лише 1 потік матиме доступ до всіх бакетів, і вся мапа блокується.

Це означає, що поки один потік не завершить свою роботу, інші потоки не зможуть увійти. У результаті операції в ConcurrentHashMap виконуються просто швидше.

Також у Collections є інші методи для зручної роботи з колекціями:

Note
Примітка

Клас Collections надає зручні методи для роботи з колекціями у Java, спрощуючи виконання поширених операцій. Синхронізовані колекції, створені за допомогою методів Collections, корисні для потокобезпечності, але для більш складних багатопотокових задач краще використовувати колекції з пакету java.util.concurrent.

1. Який метод класу Collections використовується для створення незмінного списку?

2. Який із наведених методів класу Collections повертає потокобезпечну мапу?

3. У чому різниця між ConcurrentHashMap та synchronizedMap?

question mark

Який метод класу Collections використовується для створення незмінного списку?

Select the correct answer

question mark

Який із наведених методів класу Collections повертає потокобезпечну мапу?

Select the correct answer

question mark

У чому різниця між ConcurrentHashMap та synchronizedMap?

Select the correct answer

Все було зрозуміло?

Як ми можемо покращити це?

Дякуємо за ваш відгук!

Секція 2. Розділ 8

Запитати АІ

expand

Запитати АІ

ChatGPT

Запитайте про що завгодно або спробуйте одне із запропонованих запитань, щоб почати наш чат

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

bookПриклади Використання Методів Колекцій

Свайпніть щоб показати меню

Note
Примітка

Сьогодні ми переважно розглянемо методи, які допомагають створювати потокобезпечні колекції.

Методи Collections

Нижче наведено деякі важливі методи, які надає клас для створення синхронізованих колекцій Collections:

synchronizedList(List<T> list): Повертає синхронізований (потокобезпечний) список, який підтримує той самий контракт, що й переданий список.

Main.java

Main.java

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

synchronizedSet(Set<T> set): Повертає синхронізовану (потокобезпечну) множину, яка підтримує той самий контракт, що й передана множина.

Main.java

Main.java

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

synchronizedMap(Map<K, V> m): Повертає синхронізовану (потокобезпечну) мапу, яка підтримує той самий контракт, що й передана мапа.

Main.java

Main.java

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

unmodifiableList(List<? extends T> list): Повертає незмінний список, що містить ті самі елементи, що й вказаний список.

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): Повертає незмінну мапу, що містить ті самі відображення, що й вказана мапа.

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): Повертає незмінну множину, що містить ті самі елементи, що й задана множина.

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

У чому ж полягає різниця між створенням синхронізованих колекцій за допомогою звичайних реалізацій (розглянутих у попередніх розділах) та використанням методів класу Collections?

Розглянемо різницю на прикладі однієї колекції типу Map

Відмінності між ConcurrentHashMap та synchronizedMap()

ConcurrentHashMap використовує сучасний підхід, відомий як розділення блокувань (lock splitting), який ділить мапу на сегменти та синхронізує операції лише на рівні окремих сегментів. Такий підхід дозволяє декільком потокам одночасно зчитувати та записувати дані у різні сегменти мапи, що підвищує конкурентність та продуктивність.

Метод synchronizedMap() обгортає оригінальну мапу у синхронізований проксі-об'єкт. Усі методи цього проксі-об'єкта синхронізовані, що забезпечує потокобезпечність. Однак цей підхід може знижувати продуктивність у багатопотоковому середовищі через високу частоту блокувань.

Наприклад, якщо ConcurrentHashMap записує у різні бакети, потоки не блокують один одного. Однак, якщо до одного бакету звертаються 2 потоки, один з них чекатиме. З іншого боку, якщо колекція створена через synchronizedMap(), лише 1 потік матиме доступ до всіх бакетів, і вся мапа блокується.

Це означає, що поки один потік не завершить свою роботу, інші потоки не зможуть увійти. У результаті операції в ConcurrentHashMap виконуються просто швидше.

Також у Collections є інші методи для зручної роботи з колекціями:

Note
Примітка

Клас Collections надає зручні методи для роботи з колекціями у Java, спрощуючи виконання поширених операцій. Синхронізовані колекції, створені за допомогою методів Collections, корисні для потокобезпечності, але для більш складних багатопотокових задач краще використовувати колекції з пакету java.util.concurrent.

1. Який метод класу Collections використовується для створення незмінного списку?

2. Який із наведених методів класу Collections повертає потокобезпечну мапу?

3. У чому різниця між ConcurrentHashMap та synchronizedMap?

question mark

Який метод класу Collections використовується для створення незмінного списку?

Select the correct answer

question mark

Який із наведених методів класу Collections повертає потокобезпечну мапу?

Select the correct answer

question mark

У чому різниця між ConcurrentHashMap та synchronizedMap?

Select the correct answer

Все було зрозуміло?

Як ми можемо покращити це?

Дякуємо за ваш відгук!

Секція 2. Розділ 8
some-alt