ConcurrentDictionary in .NET 4 의 문제점 CSharp

.NET 4 는 멀티스레드에 안전한 자료구조용 클래스가 많이 추가되었습니다. 
System.Collections.Concurrent namespace에 추가되어 있습니다. 개인적으로는 BlockingCollection{T} 이 가장 마음에 듭니다만... 

Krzysztof Kozmic 란 사람 (Castle.DynamicProxy 제작자)이 ConcurrentDictionary{TKey, TValue} 의 GetOrAdd() 메소드가 스레드 안전한 메소드가 아님을 지적했습니다. 이 글 (ConcurrentDictionary in .NET 4, not what you would expect) 에 따르면, Value Factory Method가 Lazy 형태의 delegate라면, 스레드에 안전하지 않음을 보여주고 있네요. 역시 사용자의 유연성을 확장하기 위해, 함수 인자 (Function Parameter) 를 제공하는 메소드에서는 위와 같은 문제가 발생할 소지가 크겠지요.

이에 대해 MSND 설명 글 - ConcurrentDictionary 에서 항목 추가 및 제거 를 보게 되면, 일반적인 사용에 대해 스레드-안전 클래스라고 합니다. - 위 예처럼 valueFactory delegate에서 엄한 짓만 안한다면 그렇다는 얘기입니다.

두 글을 보면 결국, 

1. ConcurrentDictionary는 멀티스레드가 경합하지 않고, 안전하게 Data가 처리되도록 해준다.
2. 단 사용자가 제공하는 함수인자의 수행 코드가 멀티스레드에 안전하지 않거나, Lazy<T> 형식이라면, 예상외의 결과를 가져올 수도 있다.

결국 멀티스레드에 대해 잘 이해하고 사용해야 합니다만, Framework 를 더 안전하게 만들기 위해, 지침을 좀 더 자세히 설명해 줬으면 하네요.

전혀 다른 내용입니다만, 멀티스레드에서 같은 키에 항상 다른 값을 저장하고 싶을 때가 있습니다, 이 때는 아래와 같이 ThreadLocal<T> 를 사용하면 됩니다.

뭐 장난 삼아 만들어 봤습니다. ThreadLocal 변수가 각 스레드별로 다른 값을 제공하는 방식입니다.