İş parçacığı açısından güvenli bir koleksiyona karşı iş parçacığı olmayan bir koleksiyon farklı bir şekilde incelenebilir.
Kasa dışında, katip olmayan bir mağaza düşünün. İnsanlar sorumlu davranmazlarsa bir sürü sorununuz var. Örneğin, bir müşteri şu anda piramidi inşa ederken bir piramit kutusundan bir kutu aldığını varsayalım, tüm cehennem kırılır. Ya da iki müşteri aynı ürüne aynı anda ulaşırsa kim kazanır? Bir kavga olacak mı? Bu, iş parçacığı olmayan bir koleksiyondur. Sorunlardan kaçınmanın birçok yolu var, ancak hepsi bir tür kilitleme veya bir şekilde açık erişim gerektirir.
Öte yandan, masasında bir katip olan bir mağaza düşünün ve sadece onun aracılığıyla alışveriş yapabilirsiniz. Sıraya girin ve ondan bir eşya isteyin, size geri getirir ve çizginin dışına çıkarsınız. Birden fazla öğeye ihtiyacınız varsa, her gidiş-dönüş yolculuğunda hatırlayabildiğiniz kadar öğe alabilirsiniz, ancak katibi zorlamaktan kaçınmak için dikkatli olmanız gerekir, bu, arkanızdaki diğer müşterileri kızdırır.
Şimdi bunu bir düşünün. Bir memurun olduğu dükkanda, sıranın sonuna kadar gidip memura "Hiç tuvalet kağıdın var mı?" Diye sorarsan ve o "Evet" derse ve sonra "Tamam, ben" dersen Ne kadar ihtiyacım olduğunu bildiğimde size geri döneceğim ", sonra sıranın önüne geri döndüğünüzde, mağaza elbette tükenebilir. Bu senaryo, iş parçacığı güvenli bir koleksiyon tarafından engellenmez.
İş parçacığı güvenli bir koleksiyon, birden çok iş parçacığından erişilse bile, dahili veri yapılarının her zaman geçerli olduğunu garanti eder.
İş parçacığı güvenli olmayan bir koleksiyon, bu tür garantilerle birlikte gelmez. Örneğin, bir iş parçacığındaki bir ikili ağaca bir şey eklerseniz, başka bir iş parçacığı ağacı yeniden dengelemekle meşgulse, öğenin ekleneceğinin garantisi yoktur veya ağacın daha sonra hala geçerli olacağının garantisi yoktur, umudun ötesinde bozulmuş olabilir.
Ancak, iş parçacığı güvenli bir koleksiyon, iş parçacığı üzerindeki ardışık işlemlerin hepsinin dahili veri yapısının aynı "anlık görüntüsü" üzerinde çalışacağını garanti etmez; bu, bunun gibi bir kodunuz varsa:
if (tree.Count > 0)
Debug.WriteLine(tree.First().ToString());
bir NullReferenceException alabilirsiniz çünkü inbetween tree.Count
ve tree.First()
, başka bir iş parçacığı ağaçtaki kalan düğümleri temizledi, bu da First()
geri döneceği anlamına gelir null
.
Bu senaryo için, söz konusu koleksiyonun istediğinizi elde etmek için güvenli bir yolu olup olmadığını görmeniz gerekir, belki yukarıdaki kodu yeniden yazmanız veya kilitlemeniz gerekebilir.