2011-03-08 13 views
2

의 오류 "값은 null 일 수 없습니다". 그러나 비 정기적 인 간격에서 우리는 "값은 null이 될 수 없습니다"오류를 얻습니다.내가 싱글 톤 패턴을 구현하는 클래스를 싱글 톤 패턴

08.03.2011 11:40:39 ERROR Message : Value cannot be null. 
Parameter name: source 

StackTrace : at System.Linq.Enumerable.Where[TSource](IEnumerable`1 source, Func`2   predicate) 
at Search.Service.SearchService.Search(String keyword, Int32 offset, Int32 hit, String navstate, String username, Boolean issecure, Int32 suggest, String sortref, String fields, Int32 IsFirstSearch, String misspelled, String category) in D:\tfs\Hey\HeyRestApi\HeyService\HeyService.cs:line 68 

로그 파일 내 서비스에서 아래 행을 언급 :

var blacks = SearchSingletonObject.Foundation.blacklist.Where<string>(x => item.Equals(x)).FirstOrDefault(); 

그것은 null 값을 받고 이상하게도 "블랙리스트"개체를 보인다 여기 내 로그 파일입니다. 오류가 발생하면 IIS를 다시 설정하여 응용 프로그램을 작동시켜야합니다. 로컬 서버에서 오류를 재현 할 수 없습니다. 고객 생산 환경에서만 발생합니다.

어떻게 문제를 해결할 수 있으며이 이상한 오류의 원인이 무엇일까요? 사전에

감사합니다,

+0

왜 패턴을 모두 피하지 않으시겠습니까? http://stackoverflow.com/questions/162042/are-there-any-viable-alternatives-to-the-gof-singleton-pattern을 참조하십시오. – TrueWill

답변

2

Double-checked locking is broken.

짧은 설명 :

foundation 당신이 재단의 회원이 프로세서의 관점에서 null이 아닌 확신 할 수없는 잠금이없는 경우, null가 아닌 경우에도

.

자물쇠 외부에있는 if 문을 제거해야합니다.

private static volatile SearchSingletonObject foundation = null; 

The need for volatile modifier in double checked locking in .NET는 자세한 내용이 있습니다

업데이트

더 나은 솔루션은 휘발성 기초를 표시하는 것입니다.

+0

설득력있는 답변 arx에 감사드립니다. 오늘 밤 우리는 당신이 말한대로 우리의 서비스를 발표 할 것입니다. – anilca

+0

Java에서 패턴이 깨졌으며 Java에 따라 다릅니다. 이 .NET에 C#, 그래서이 질문에 대답하지 않습니다. –

+1

Java에서 깨졌으며 C#에서 문제가 발생했습니다. 자세한 내용은 여기 : http://stackoverflow.com/questions/1964731/the-need-for-volatile-modifier-in-double-checked-locking-in-net – arx