Потокобезопасная коллекция по сравнению с не-потолочной коллекцией можно посмотреть по-другому.
Рассмотрите возможность покупки в магазине без присмотра, кроме как при оформлении заказа. У вас много проблем, если люди не действуют ответственно. Например, предположим, что клиент берет банку из пирамиды, пока клерк в настоящее время строит пирамиду, весь ад сломается. Или, что, если два клиента достигнут одного и того же предмета одновременно, кто победит? Будет ли бой? Это нетекающая коллекция. Существует множество способов избежать проблем, но все они требуют какой-то блокировки или, скорее, явного доступа в той или иной форме.
С другой стороны, рассмотрите магазин с клерком на столе, и вы можете только ходить по нему через магазин. Вы попадаете в очередь и спрашиваете его о предмете, он возвращает его вам, и вы выходите из линии. Если вам нужно несколько предметов, вы можете подобрать столько предметов на каждом кругообороте, как вы помните, но вам нужно быть осторожным, чтобы не дотрагиваться до клерка, это вызовет гнев других клиентов в очереди за вами.
Теперь рассмотрим это. В магазине с одним клерком, что, если вы доберетесь до передней части линии и спросите клерка «У вас есть туалетная бумага», и он говорит «Да», а затем вы идете «Хорошо, я», я вернусь к вам, когда я знаю, сколько мне нужно », то к тому времени, когда вы вернетесь на фронт линии, магазин, конечно же, может быть распродан. Этот сценарий не препятствует сборке потоковых сетей.
Коллекция потокобезопасности гарантирует, что ее внутренние структуры данных действительны во все времена, даже если они доступны из нескольких потоков.
В комплект поставки, не входящей в потолок, не предоставляются такие гарантии. Например, если вы добавляете что-то в двоичное дерево в одном потоке, в то время как другой поток занят перебалансировкой дерева, нет никакой гарантии, что элемент будет добавлен, или даже что дерево все еще действует после этого, оно может быть повреждено без надежды.
Коллекция поточно не означает, однако, гарантировать, что последовательные операции на резьбе всю работу на том же «снимок» своей внутренней структуры данных, что означает, что если у вас есть такой код:
if (tree.Count > 0)
Debug.WriteLine(tree.First().ToString());
вы можете получить исключение NullReferenceException, потому что между tree.Count
и tree.First()
другой поток очистил оставшиеся узлы в дереве, что означает, что First()
вернет null
.
Для этого сценария вам нужно либо посмотреть, есть ли у сборника безопасный способ получить то, что вы хотите, возможно, вам нужно переписать код выше, или вам может потребоваться блокировка.
Вы можете увидеть [этот код проекта статьи по теме] (Http: //www.codeproject.com/Статьи/548406/Словарь-плюс-Блокировка-против-ConcurrentDictionar) – nawfal