나는 달성하려고하는 것에 대해 한 시간 동안 집중을 찾고 있지만 특정한 방향으로 결정적인 것을 찾지 못했다. 다음과 같이로딩이 실패 할 때 쓰레드 세이프 (Threadsafe) 게으른 로딩
내 상황은 다음과 같습니다
- 내가 (.NET 웹 서비스) 나는로드 무시할 수없는 시간을 개체를 사용하여 수업을
- 다중 스레드 응용 프로그램을 가지고, 그래서 나는 것
내가 이전에이를 구성 접근 방식을 사용했다 정적 클래스 멤버
가장 직관적으로 보이는 접근법은 이중 확인 잠금을 사용하는 것입니다. 그 두 번 체크 잠금의 악마에 대해 얘기하고 주위에 페이지가 많이 있는데, 내가 이미하고있는 정적 생성자를 사용하는 말,하지만 그것은 나를 위해 옵션이 될 것하지 않는 정적 생성자가 실패하고 전체 수업을 중단시킬 잠재력.
구현 (단순화 된, 당연히) 나는 다음을 사용하려고 생각합니다. 모든 클래스와 멤버 이름은 순수하게 설명하는 것이며 실제로 사용하는 이름이 아닙니다. 이 접근법은 문제가 될 것입니까? 누구든지 더 나은 접근법을 제안 할 수 있습니까? 당신이 .NET 4.0을 사용하는 경우
public class LazyMembers
{
private static volatile XmlDocument s_doc;
private static volatile XmlNamespaceManager s_nsmgr;
private static readonly object s_lock = new object();
private static void EnsureStaticMembers()
{
if (s_doc == null || s_nsmgr == null)
{
lock (s_lock)
{
if (s_doc == null || s_nsmgr == null)
{
// The following method might fail
// with an exception, but if it succeeds,
// s_doc and s_nsmgr will be initialized
s_doc = LoadDoc(out s_nsmgr);
}
}
}
}
public XmlNamespaceManager NamespaceManager
{
get
{
EnsureStaticMembers();
return s_nsmgr;
}
}
public XmlDocument GetDocClone()
{
EnsureStaticMembers();
return (XmlDocument)s_doc.Clone();
}
}
.NET에서 이중 확인 잠금 기능이 작동하지 않습니까? 소환? –
Jon Skeets의 기사가 가장 눈에 띄었지만 C#에서 안전한지 아무도 모르는 것을 말하는 많은 기사와 포럼 스레드를 보았습니다. 그리고/또는 전체적으로 사용하지 말 것을 권장했습니다. 아직 .NET에서 사용하는 사람을 실제로 추천합니다. – Jimmy
나는 Jon이 매우보기 흉한 분석을했다고 생각한다. 그것은 작동하지만 "플랫폼 버전"과 함께 "메모리 모델"과 같은 단어는 당신을 놀라게 할 것입니다. 휘발성을 사용하여 –