2010-12-08 2 views
1

게으른 < > (bool) 생성자에 대한 Microsoft의 설명서를 읽는 것이 혼란 스럽습니다.게으른 <T> (bool) 생성자 설명서

isThreadSafe :

파라미터는 다음과 같이 설명하는 다수의 스레드가 동시에 가능한 인스턴스를 만들기 위해 참; 한 번에 하나의 스레드에서만 인스턴스를 사용할 수 있도록하려면 false입니다.

내가 일반적 접근에 작성합니다 코드가있는 경우 :

If _rulesCache Is Nothing Then 

    SyncLock (_lockRulesCache) 

     If _rulesCache Is Nothing Then 

      _rulesCache = New RulesCache() 

     End If 

    End SyncLock 

End If 

Return _rulesCache 

나는 게으른 타입의 생성자에서 참 또는 거짓 사용 하시겠습니까?

Private _rulesCache As New Lazy(Of RulesCache)(**?**) 

그래서 내 접근이된다 : 객체가 생성되면

Return _rulesCache.Value 

1), 내부적으로 다중 스레드 액세스를 처리 할 수 ​​있습니다.

2) 접근자를 동시에 타격하는 스레드가 여러 개 있고 객체가 존재하지 않는다면 객체가 한 번만 생성된다는 것을 확인하면됩니다.

설명서에 따르면 문 1은 매개 변수가 거짓이어야 함을 나타냅니다. 문 2는 매개 변수가 참이어야 함을 의미합니다.

나는 이것을 과장 생각하고있어 혼란 스럽다. 또는 위의 두 문장이 실제로 서로 승률이 같지 않으므로 객체 인스턴스화를 관리하기 위해 수동 잠금을 고수해야합니다.

답변

2

문 2가 바람직한 해석입니다. 이 매개 변수는 지연 초기화가 완료된 후 객체의 동작에 영향을 미치지 않습니다. 두 개의 스레드가 우발적으로 두 번 레이싱 및 인스턴스화하는 것을 방지합니다. 호기심이 있다면 반사경에서 확인할 수 있습니다.

+0

그래서 isThreadSafe 값을 Lazy 인스턴스가 동시에 (true) 동시에 인스턴스화하려고하는 여러 스레드를 예상하고 처리해야하는지 아니면 단일 스레드 환경에서만 사용되고 있는지 최적화 된 코드를 사용할 수 있는지 여부를 해석해야합니다 단일의 thread가 그것을 인스턴스화합니다 (false). 예? – ulty4life

+0

예, 정확한 요약입니다. – mquander

관련 문제