스레드 세이프 컬렉션 대 비 threadsafe 컬렉션은 다른 방식으로 볼 수 있습니다.
계산대를 제외하고 점원이없는 점을 고려하십시오. 사람들이 책임감있게 행동하지 않으면 많은 문제가 있습니다. 예를 들어, 고객이 현재 피라미드를 만들면서 피라미드 캔에서 캔을 가져 간다고 가정 해 보겠습니다. 모든 지옥은 느슨해집니다. 또는 동시에 두 명의 고객이 같은 항목에 도달하면 누가 이깁니 까? 싸울 것인가? 이것은 threadsafe가 아닌 콜렉션입니다. 문제를 피할 수있는 방법은 많지만 모든 종류의 잠금 또는 어떤 방식 으로든 명시 적으로 액세스해야합니다.
한편 책상에 점원이있는 점포를 고려해 볼 때 상점을 통해서만 쇼핑을 할 수 있습니다. 너는 일렬로 나란히 서서, 그에게 물건을 요구한다, 그는 그것을 당신에게 되 가져온다. 그리고 당신은 선에서 나온다. 여러 품목이 필요하다면 기억할 수있는만큼의 왕복 여행 당 많은 품목을 픽업 할 수 있지만 점원을 호되게 피하지 않도록주의해야합니다. 그러면 다른 고객이 뒤에서 분노하게됩니다.
이제 이것을 고려하십시오. 점원이 한 명있는 가게에서 선의 맨 끝까지 가면 점원에게 "화장지가 있습니까?"라고 묻습니다. 그리고 그는 "예"라고 말한 다음 " 내가 얼마나 필요한지 알게되면 다시 돌아올거야. "라고 말하면서, 당신이 줄 서기 전까지 상점은 매진 될 수 있습니다. 이 시나리오는 스레드 세이프 콜렉션에 의해 방지되지 않습니다.
threadsafe 수집은 다중 스레드에서 액세스 된 경우에도 내부 데이터 구조가 항상 유효 함을 보장합니다.
비 threadsafe 컬렉션에는 이러한 보증이 제공되지 않습니다. 예를 들어, 한 스레드에서 이진 트리에 무언가를 추가하는 경우 다른 스레드가 트리의 균형을 조정하는 동안 바쁜 경우 아이템이 추가되거나 트리가 여전히 유효하다는 보장이 없기 때문에 희망을 넘어 부패 할 수 있습니다.
스레드 세이프 수집은, 그러나,에 스레드에서 모든 작업을하는 순차적 인 작업을 보장하지 않습니다 같은 의미 내부 데이터 구조의 "스냅 샷"당신은 같은 코드가있는 경우 :
if (tree.Count > 0)
Debug.WriteLine(tree.First().ToString());
을 tree.Count
과 tree.First()
사이에 다른 스레드가 트리의 나머지 노드를 지우므로 First()
이 null
을 반환하기 때문에 NullReferenceException이 발생할 수 있습니다.
이 시나리오에서는 원하는 컬렉션을 얻는 데 안전한 방법이 있는지 확인해야합니다. 위의 코드를 다시 작성해야하거나 잠글 필요가 있습니다.
당신은 (HTTP [주제에이 코드 프로젝트 기사]를 참조 할 수 있습니다 : //www.codeproject를.com/Articles/548406/Dictionary-plus-Locking-versus-ConcurrentDictionar) Concurrent Dictionery를 진행하면 – nawfal