Я щойно побачив цю структуру даних в Java 6 API, і мені цікаво, коли це буде корисним ресурсом. Я вчуся на іспит scjp, і я не бачу, щоб це було висвітлено в книзі Кеті Сьєрри, хоча я бачив пробні іспитові запитання, в яких про це згадується.
Я щойно побачив цю структуру даних в Java 6 API, і мені цікаво, коли це буде корисним ресурсом. Я вчуся на іспит scjp, і я не бачу, щоб це було висвітлено в книзі Кеті Сьєрри, хоча я бачив пробні іспитові запитання, в яких про це згадується.
Відповіді:
ConcurrentSkipListSet та ConcurrentSkipListMap корисні, коли вам потрібен відсортований контейнер, до якого будуть доступні кілька потоків. Це, по суті, еквіваленти TreeMap і TreeSet для одночасного коду.
Реалізація для JDK 6 базується на високопродуктивних динамічних хеш-таблицях без блокування та наборах на основі списків від Maged Michael в IBM, що показує, що ви можете реалізувати багато операцій зі списками пропусків атомарно за допомогою операцій порівняння та обміну (CAS) . Вони не мають блокування, тому вам не доведеться турбуватися про накладні витрати synchronized
(для більшості операцій), коли ви використовуєте ці класи.
На даний момент в Java немає одночасно реалізованої Map / Set на основі червоно-чорного дерева . Я трохи переглянув літературу і знайшов кілька робіт, які показували паралельні дерева RB, що перевершували списки пропусків, але багато з цих тестів проводилися з транзакційною пам'яттю , яка в даний час не підтримується в апаратних засобах жодної великої архітектури.
Я припускаю, що хлопці JDK взяли тут пропущений список, тому що реалізація була добре відома і тому, що зробити її без блокування простою та портативною (за допомогою CAS). Якщо хтось хоче пояснити, будь ласка. Мені цікаво.
списки пропуску - це відсортовані списки, які ефективно змінювати за допомогою журналу (n). в цьому відношенні це як TreeSet. однак немає ConcurrentTreeSet. те, що я чув, - це те, що пропуск списку дуже простий у реалізації, мабуть, тому.
У будь-якому випадку, коли вам потрібен одночасний, відсортований та ефективний набір, ви можете використовувати ConcurrentSkipListSet
Вони корисні, коли вам потрібен набір, до якого можна безпечно отримати доступ кількома потоками одночасно. Він також забезпечує пристойну продуктивність, будучи слабко послідовним - вставки можна зробити безпечно, коли ви переглядаєте Набір, але немає гарантії, що ваш Ітератор побачить цю вставку.
ConcurrentSkipListMap був фантастичною знахідкою, коли мені потрібно було реалізувати рівень реплікації для власного кешу. Аспекти Map реалізували кеш-пам’ять, а основні аспекти списку дозволяють мені відстежувати порядок появи об’єктів у кеші. Аспект "пропустити" цього списку дозволив ефективно видалити об'єкт з одного місця у списку та докинути його до кінця, коли він був замінений у кеші.