Page 266 - 6253
P. 266
java.util.concurrent.atomic визначено цілий ряд класів, в яких ефективно
використовуються команди машинного рівня, що гарантують атомарність операцій
відмінних від присвоєння, без використання блокувань. Наприклад, в класі
AtomicInteger визначено методи incrementAndGet() та decrementAndGet(), які
здійснюють атомарне інкрементування та декрементування цілочисельного
значення. Об’єкт даного класу можна сміливо використовувати як спільний
лічильник без додаткової синхронізації потоків.
У даному пакеті визначено також класи AtomicBoolean, AtomicLong,
AtomicReference і атомарні масиви логічних, цілих, дробових значень та посилань.
Дані класи призначені в основному для розробників, що проектують різноманітні
утиліти паралелізму.
Досить часто від асинхронного доступу необхідно захистити певну структуру
даних. Наприклад, певний потік виконує запис елемента у хеш-таблицю.
Припустимо, цей потік призупиняє своє виконання в процесі переприсвоєння
посилань між групами хеш-таблиці. Якщо інший потік почне прохід по тій же самій
хеш-таблиці, то він може «наткнутися» на неправильні посилання, що призведе до
появи різноманітних помилок виконання.
Захистити будь-яку структуру даних від спільного доступу з декількох потоків
можна встановивши блокування, але зазвичай достатньо просто вибрати
потокобезпечну реалізацію відповідної структури даних.
У пакеті java.util.concurrent представлено декілька класів, що дають можливість
створювати потокобезпечні карти, списки, множини та черги: ConcurrentHashMap,
ConcurrentSkipListMap, ConcurrentSkipListSet та ConcurrentLinkedQueue.
На відміну від «класичних» колекцій, метод size() в потокобезпечній колекції
не гарантує повернення правильного розміру колекції. Для визначення розміру
однієї із перерахованих вище колекцій зазвичай необхідно перебрати всі її елементи.
Потокобезпечні колекції повертають слабо сумісні ітератори, що дає змогу
відображати всі зміни, внесені в колекцію після її створення. Проте, такі ітератори
ніколи не повертають одне і те ж саме значення двічі і не генерують виняток типу
ConcurrentModificationException.
Потокобезпечна Хеш-карта ефективно підтримує велику кількість зчитуючих
265