Page 195 - 6571
P. 195

У класах ConcurrentHashMap та ConcurrentSkipListMap
            визначено  корисні  методи  для  виконання  атомарних  операцій
            створення і видалення взаємозв’язків між ключами і значеннями,
            які      також        називаються           асоціаціями.          Зокрема,         метод

            putIfAbsent()  атомарно  додає  нову  асоціацію,  якої  не  було
            раніше.  Така  можливість  дозволяє  організувати  кеш,  який  буде

            доступний для декількох потоків, проте тільки один з них зможе
            додавати елементи у кеш в будь-який момент часу.

                  cache.putIfAbsent(key, value);

                  Зворотну атомарну операцію можна виконати за допомогою
            методу  remove(),  який,  у  свою  чергу  викликає  метод
            removeIfPresent().

                  cache.remove(key, value);

                  І,  нарешті,  для  модифікації    елемента  в  потокобезпечній
            колекції використовується метод replace(), в який передається

            ключ елемента та його нове значення.

                  cache.replace(key, oldValue, newValue);

                  Класи  CopyOnWriteArrayList  та  CopyOnWriteArraySet
            представляють собою потокобезпечні колекції, в яких при будь-
            яких  змінах  створюється  копія  базового  масиву.  Такий  підхід  є

            зручним у випадку, якщо кількість потоків, що виконують обхід
            колекції,  значно  перевищує  кількість  потоків,  що  змінюють  її
            стан. Коли відбувається створення ітератора такої колекції, то він

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

            буде  замінений  новим.  Як  наслідок,  «старий»  ітератор  зберігає
            узгоджений (хоча й потенційно застарілий) стан колекції, що не
            вимагає додаткових затрат на синхронізацію.


                  Запитання для самоперевірки

                  1. Яке  призначення  ключового  слова  synchronized  у  мові
            Java?

                  2. Які методи дозволяється оголошувати із ключовим словом
            synchronized?





                                                        194
   190   191   192   193   194   195   196   197   198   199   200