Коли корисний ConcurrentSkipListSet?


84

Я щойно побачив цю структуру даних в Java 6 API, і мені цікаво, коли це буде корисним ресурсом. Я вчуся на іспит scjp, і я не бачу, щоб це було висвітлено в книзі Кеті Сьєрри, хоча я бачив пробні іспитові запитання, в яких про це згадується.

Відповіді:


175

ConcurrentSkipListSet та ConcurrentSkipListMap корисні, коли вам потрібен відсортований контейнер, до якого будуть доступні кілька потоків. Це, по суті, еквіваленти TreeMap і TreeSet для одночасного коду.

Реалізація для JDK 6 базується на високопродуктивних динамічних хеш-таблицях без блокування та наборах на основі списків від Maged Michael в IBM, що показує, що ви можете реалізувати багато операцій зі списками пропусків атомарно за допомогою операцій порівняння та обміну (CAS) . Вони не мають блокування, тому вам не доведеться турбуватися про накладні витрати synchronized(для більшості операцій), коли ви використовуєте ці класи.

На даний момент в Java немає одночасно реалізованої Map / Set на основі червоно-чорного дерева . Я трохи переглянув літературу і знайшов кілька робіт, які показували паралельні дерева RB, що перевершували списки пропусків, але багато з цих тестів проводилися з транзакційною пам'яттю , яка в даний час не підтримується в апаратних засобах жодної великої архітектури.

Я припускаю, що хлопці JDK взяли тут пропущений список, тому що реалізація була добре відома і тому, що зробити її без блокування простою та портативною (за допомогою CAS). Якщо хтось хоче пояснити, будь ласка. Мені цікаво.


1
Це також корисно, якщо ви хочете ефективно відстежувати унікальні записи в багатопотоковому середовищі.
anataliocs

4

списки пропуску - це відсортовані списки, які ефективно змінювати за допомогою журналу (n). в цьому відношенні це як TreeSet. однак немає ConcurrentTreeSet. те, що я чув, - це те, що пропуск списку дуже простий у реалізації, мабуть, тому.

У будь-якому випадку, коли вам потрібен одночасний, відсортований та ефективний набір, ви можете використовувати ConcurrentSkipListSet


2

Вони корисні, коли вам потрібен набір, до якого можна безпечно отримати доступ кількома потоками одночасно. Він також забезпечує пристойну продуктивність, будучи слабко послідовним - вставки можна зробити безпечно, коли ви переглядаєте Набір, але немає гарантії, що ваш Ітератор побачить цю вставку.


1

ConcurrentSkipListMap був фантастичною знахідкою, коли мені потрібно було реалізувати рівень реплікації для власного кешу. Аспекти Map реалізували кеш-пам’ять, а основні аспекти списку дозволяють мені відстежувати порядок появи об’єктів у кеші. Аспект "пропустити" цього списку дозволив ефективно видалити об'єкт з одного місця у списку та докинути його до кінця, коли він був замінений у кеші.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.