2008-11-08 6 views
1

개체를 잠글 때 해당 개체가 전체 응용 프로그램에 잠겨 있습니까? 예를 들어잠금 장치 (objlocker)가 해당 개체 스레드를 앱 전체에 안전하게 만드나요? 정적 멤버는 자동으로 스레드로부터 안전합니까?

, 요컨대 제 19.6.1 "안전 및 .NET 프레임 워크 유형을 스레드"에서 C# 3.0에서이 조각 :

lock (list) 
     list.Add ("Item " + list.Count); 

다른 것을 방지 :

static void AddItems() 
    { 
    for (int i = 0; i < 100; i++) 
     lock (list) 
     list.Add ("Item " + list.Count); 

    string[] items; 
    lock (list) items = list.ToArray(); 
    foreach (string s in items) Console.WriteLine (s); 
    } 

첫 번째 잠금을합니까 스레드가 액세스하는 것 :

lock (list) items = list.ToArray(); 

또는 둘 모두 동시에 실행할 수 있습니까?

그리고 CLR은 자동으로 정적 메서드를 안전하게 만듭니다. 아니면 개발자에게 달린 것입니까?

감사합니다, 존

답변

3
class UsefulStuff { 
    object _TheLock = new object { }; 
    public void UsefulThingNumberOne() { 
     lock(_TheLock) { 
      //CodeBlockA 
     } 
    } 
    public void UsefulThingNumberTwo() { 
     lock(_TheLock) { 
      //CodeBlockB 
     } 
    } 
} 

CodeBlockACodeBlockB과는 상이한 스레드를 동시에 실행하는 것을 방지한다.

_TheLock 그 자체는 완전히 영향을받지 않습니다.

+0

나를 정리해 주셔서 감사합니다. – John

3

자동으로 정적 메서드를하지 않습니다 CLR 스레드 안전; 너 혼자해야 해.

lock (목록)은 해당 객체를 잠금으로 사용하므로 다른 스레드가 lock (list) (동일한 'list'객체 사용)으로 다른 지점에 도달하면 다른 스레드는 첫 번째 스레드가 잠금을 해제 할 때까지 차단합니다 .

lock (foo)은 "foo 객체를 잠그지"않고 중요한 섹션 ("lock (o) stmt"구문의 문)이 ")는 현재 스레드가 잠금을 획득 한 경우에만 실행됩니다. 그들은 모두 동일한 객체 인스턴스 _TheLock 잠겨 있기 때문에

+0

빠른 응답을 보내 주셔서 감사합니다! – John

5

다른주의 사항은 정적 생성자가 런타임에 의해 스레드 안전 모드로 실행된다는 것입니다. 싱글 톤을 생성하고 다음과 같이 선언하면 :

public class Foo 
{ 
    private static Foo instance = new Foo(); 

    public static Foo Instance 
    { 
     get { return instance; } 
    } 
} 

그러면 스레드 안전성이 보장됩니다. 하지만 새로운 Foo 인스턴스를 인스턴스 가져 오기 도구 인 내부에 인스턴스화하면 사용자가 직접 스레드 안전성을 작성해야합니다 (예 : 객체 잠금)