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 Ви знаєте?
   149   150   151   152   153   154   155   156   157   158   159