내보내기(0) 인쇄
모두 확장

Monitor 클래스

개체에 대한 액세스를 동기화하는 메커니즘을 제공합니다.

네임스페이스: System.Threading
어셈블리: mscorlib(mscorlib.dll)

[ComVisibleAttribute(true)] 
public static class Monitor
/** @attribute ComVisibleAttribute(true) */ 
public final class Monitor
ComVisibleAttribute(true) 
public final class Monitor

Note참고

이 클래스에 적용되는 HostProtectionAttribute 특성의 Resources 속성 값은 Synchronization | ExternalThreading입니다. HostProtectionAttribute는 대개 아이콘을 두 번 클릭하거나, 명령을 입력하거나, 브라우저에서 URL을 입력하여 시작되는 데스크톱 응용 프로그램에 영향을 미치지 않습니다. 자세한 내용은 HostProtectionAttribute 클래스나 SQL Server 프로그래밍 및 호스트 보호 특성을 참조하십시오.

Monitor 클래스는 하나의 스레드에 개체 잠금을 부여하여 개체에 대한 액세스를 제어합니다. 개체 잠금 기능을 사용하면 일반적으로 임계 영역이라고 불리는 코드 블록에 대한 액세스를 제한할 수 있습니다. 한 스레드에서 개체 잠금을 소유하는 동안에는 다른 스레드에서 해당 잠금을 가져올 수 없습니다. 다른 스레드에서 잠겨 있는 다른 개체를 사용하여 코드를 실행하는 경우에만 Monitor를 사용하여 다른 스레드에서 잠금 소유자가 실행하고 있는 응용 프로그램 코드의 섹션에 액세스할 수 있도록 할 수도 있습니다.

Note참고

Monitor를 사용하여 값 형식이 아닌 개체(참조 형식)를 잠급니다. 자세한 내용은 Enter 및 개념 항목인 Monitor를 참조하십시오.

Monitor의 기능은 다음과 같습니다.

  • 필요할 때 개체와 연결됩니다.

  • 바인딩 해제되어 있으므로 모든 컨텍스트에서 직접 호출할 수 있습니다.

  • Monitor 클래스의 인스턴스를 만들 수 없습니다.

동기화된 각 개체에 대하여 다음 정보가 유지됩니다.

  • 현재 잠금을 보유한 스레드에 대한 참조

  • 잠금을 가져올 준비가 된 스레드가 포함된 준비된 큐에 대한 참조

  • 잠겨 있는 개체의 상태 변경 알림을 기다리는 스레드가 포함된 대기 중인 큐에 대한 참조

다음 표에서는 동기화된 개체에 액세스한 스레드에서 취할 수 있는 동작을 설명합니다.

동작

설명

Enter, TryEnter

개체 잠금을 가져오고, 임계 영역의 시작을 표시합니다. 다른 스레드는 잠겨 있는 다른 개체를 사용하여 임계 영역에서 명령을 실행하는 경우에만 임계 영역에 들어갈 수 있습니다.

Wait

다른 스레드에서 개체를 잠그고 액세스할 수 있도록 개체 잠금을 해제합니다. 호출한 스레드는 다른 스레드가 개체에 액세스하는 동안 대기합니다. 대기 중인 스레드에 개체의 상태 변경에 대해 알리는 데는 펄스 신호를 사용합니다.

Pulse (신호), PulseAll

하나 이상의 대기 중인 스레드에 신호를 보냅니다. 이 신호는 잠겨 있는 개체의 상태가 변경되었고 잠금의 소유자가 잠금을 해제할 준비가 되었음을 대기 중인 스레드에 알립니다. 대기 중인 스레드는 개체 잠금을 받을 수 있도록 개체의 준비된 큐에 배치됩니다. 스레드에서는 잠금을 소유하게 되면 개체의 새로운 상태가 요청된 상태에 도달했는지 확인합니다.

Exit

개체 잠금을 해제하고, 잠겨 있는 개체에서 보호하는 임계 영역의 끝을 표시합니다.

임계 영역의 시작과 끝을 표시하려면 EnterExit 메서드를 사용하십시오. 임계 영역이 인접한 명령의 집합인 경우 Enter 메서드에서 잠금을 가져오면 하나의 스레드에서만 잠긴 개체와 함께 포함된 코드를 실행할 수 있도록 해 줍니다. 이 경우 해당 명령은 try 블록에 배치하고 Exit 명령은 finally 블록에 배치하는 것이 좋습니다. 이 기능은 일반적으로 클래스의 정적 메서드 또는 인스턴스 메서드에 대한 액세스를 동기화하는 데 사용합니다. 인스턴스 메서드에 동기화된 스레드 액세스가 필요한 경우 인스턴스 메서드는 현재 인스턴스를 잠글 개체로 사용하여 Enter 및 해당 Exit 메서드를 호출합니다. 현재 인스턴스 잠금은 하나의 스레드에서만 보유할 수 있으므로 한 번에 하나의 스레드에서만 해당 메서드를 실행할 수 있습니다. 정적 메서드는 현재 인스턴스의 Type을 잠겨 있는 개체로 사용하여 유사한 방식으로 보호됩니다. EnterExit 메서드에서 제공하는 기능은 C#의 lock(Visual Basic의 경우 SyncLock) 문에서 제공하는 기능과 한 가지를 제외하고는 동일합니다. lockSyncLock은 모니터가 해제되도록 tryfinally(Visual Basic의 경우 TryFinally) 블록에서 Exit 메서드를 래핑한다는 점이 다릅니다.

임계 영역의 범위가 메서드 전체인 경우 메서드에 System.Runtime.CompilerServices.MethodImplAttribute를 배치하고 MethodImplAttribute의 생성자에 Synchronized 값을 지정하면 위에서 설명한 잠금 기능을 얻을 수 있습니다. 이 특성을 사용하면 EnterExit 문이 필요 없습니다. 해당 특성은 메서드에서 반환할 때까지 현재 스레드에서 잠금을 보유하도록 합니다. 따라서 잠금을 빨리 해제할 수 있으면 해당 특성 대신 Monitor 클래스나 C# lock 문을 사용하십시오.

주어진 개체를 잠금 및 해제하는 EnterExit 문은 해당 멤버나 클래스 경계 또는 양쪽 모두를 벗어나 외부 개체에 영향을 미칠 수 있지만, 이 방법은 사용하지 않는 것이 좋습니다.

동기화할 개체를 선택할 때는 private 또는 내부 개체에 대해서만 잠궈야 합니다. 외부 개체를 잠그면 관련되지 않은 코드에서 다른 목적으로 잠그기 위해 같은 개체를 선택할 수 있으므로 교착 상태가 될 수 있습니다.

System.Object
  System.Threading.Monitor

이 형식은 다중 스레드 작업을 수행하는 데 안전합니다.

Windows 98, Windows 2000 SP4, Windows CE, Windows Millennium Edition, Windows Mobile for Pocket PC, Windows Mobile for Smartphone, Windows Server 2003, Windows XP Media Center Edition, Windows XP Professional x64 Edition, Windows XP SP2, Windows XP Starter Edition

.NET Framework에서 모든 플래폼의 모든 버전을 지원하지는 않습니다. 지원되는 버전의 목록은 시스템 요구 사항을 참조하십시오.

.NET Framework

2.0, 1.1, 1.0에서 지원

.NET Compact Framework

2.0, 1.0에서 지원

커뮤니티 추가 항목

추가
표시:
© 2014 Microsoft