Набір колекцій, захищених від ниток, порівняно з колекцією, що не є безпечною для потоків, може розглядатися по-різному.
Розгляньте магазин без канцелярії, за винятком каси. У вас є маса проблем, якщо люди не діють відповідально. Наприклад, скажімо, що клієнт бере пилочку з піраміди, тоді як клерк будує піраміду, все пекло зірветься. Або що робити, якщо двоє клієнтів одночасно досягають одного і того ж товару, хто виграє? Чи буде бійка? Це колекція, яка не є безпечною. Існує маса способів уникнути проблем, але всі вони потребують певного блокування, а точніше явного доступу в той чи інший спосіб.
З іншого боку, розгляньте магазин з канцеляристою за столом, і ви можете робити покупки лише через нього. Ви переходите до черги і просите у нього предмет, він повертає його вам, а ви виходите з лінії. Якщо вам потрібно кілька предметів, ви можете забрати стільки предметів, котрі ви можете згадати, але вам потрібно бути обережними, щоб уникнути зависання діловодом, це злість інших клієнтів у черзі за вами.
Тепер розглянемо це. У магазині з одним канцеляристом, що робити, якщо ви добираєтесь до передньої частини рядка, і запитайте у ділової особи "Чи є у вас туалетний папір", і він каже "Так", а потім ви йдете "Добре, я" Я повернуся до вас, коли я знаю, скільки мені потрібно ", тоді до моменту, коли ви знову на передній лінії, магазин, звичайно, може бути розпроданий. Цей сценарій не перешкоджає колекції безпечних ниток.
Колекція безпечних потоків гарантує, що її внутрішні структури даних є дійсними в усі часи, навіть якщо доступ до них здійснюється з декількох потоків.
Колекція, що не містить безпеку, не має таких гарантій. Наприклад, якщо ви додасте щось до бінарного дерева на одній нитці, а інша нитка зайнята відновленням балансу дерева, немає жодної гарантії, що елемент буде доданий, або навіть те, що дерево все-таки дійсне згодом, воно може бути зіпсованим поза надією.
Однак колекція безпечних потоків не гарантує, що послідовні операції над потоком працюють над тим самим "знімком" його внутрішньої структури даних, що означає, що якщо у вас є такий код:
if (tree.Count > 0)
Debug.WriteLine(tree.First().ToString());
ви можете отримати NullReferenceException, оскільки між tree.Count
і tree.First()
інша нитка очистила решта вузлів у дереві, що означає First()
, що повернеться null
.
Для цього сценарію вам або потрібно перевірити, чи є у відповідної колекції безпечний спосіб отримати те, що ви хочете, можливо, вам потрібно буде переписати код вище, або, можливо, вам доведеться заблокувати.