Page 154 - 4868
P. 154
Ошибка! Стиль не определен. 152
корисні методи для виконання атомарних операцій створення і видалення
взаємозв’язків між ключами і значеннями, які також називаються
асоціаціями. Зокрема, метод putIfAbsent() атомарно додає нову асоціацію,
якої не було раніше. Така можливість дозволяє організувати кеш, який буде
доступний для декількох потоків, проте тільки один з них зможе додавати
елементи у кеш в будь-який момент часу.
cache.putIfAbsent(key, value);
Зворотну атомарну операцію можна виконати за допомогою методу
remove(), який, у свою чергу викликає метод removeIfPresent().
cache.remove(key, value);
І, нарешті, для модифікації елемента в потокобезпечній колекції
використовується метод replace(), в який передається ключ елемента та
його нове значення.
cache.replace(key, oldValue, newValue);
Класи CopyOnWriteArrayList та CopyOnWriteArraySet
представляють собою потокобезпечні колекції, в яких при будь-яких змінах
створюється копія базового масиву. Такий підхід є зручним у випадку, якщо
кількість потоків, що виконують обхід колекції, значно перевищує кількість
потоків, що змінюють її стан. Коли відбувається створення ітератора такої
колекції, то він містить посилання на поточний масив. Якщо в майбутньому
значення в масиві зміняться, то ітератор як і раніше буде посилатися на стару
копію масиву, а поточний масив колекції буде замінений новим. Як наслідок,
«старий» ітератор зберігає узгоджений (хоча й потенційно застарілий) стан
колекції, що не вимагає додаткових затрат на синхронізацію.
Запитання для самоперевірки
1. Яке призначення ключового слова synchronized у мові Java?
2. Які методи дозволяється оголошувати із ключовим словом
synchronized?
3. Які обмеження притаманні вбудованим блокуванням у мові Java?
4. Яким чином можна оголосити синхронізований блок засобами мови
Java?
5. У чому полягає суть процедури клієнтського блокування?
6. За допомогою яких методів у мові Java реалізовано механізм
міжпотокових комунікацій?
7. У чому полягає відмінність між викликами методів notify() та
notifyAll()?
8. Яке призначення ключового слова volatile у мові Java?
9. Яким чином ведуть себе поля та змінні оголошені із ключовим словом
final під час роботи з декількома потоками?
10. Які потокозахищені колекції визначені у мові Java Ви знаєте?