Lock 클래스
정의
중요
일부 정보는 릴리스되기 전에 상당 부분 수정될 수 있는 시험판 제품과 관련이 있습니다. Microsoft는 여기에 제공된 정보에 대해 어떠한 명시적이거나 묵시적인 보증도 하지 않습니다.
참고
이 미리 보기 API를 사용하려면 프로젝트 파일에서 EnablePreviewFeatures
속성을 True
로 설정하여 프로젝트에서 미리 보기 기능을 사용하도록 해야 합니다. 자세한 내용은 https://aka.ms/dotnet-preview-features를 참조하세요.
서로 다른 스레드 간의 코드 영역에서 상호 배제를 달성하기 위한 메커니즘을 제공합니다.
public ref class Lock sealed
[System.Runtime.Versioning.RequiresPreviewFeatures]
public sealed class Lock
[<System.Runtime.Versioning.RequiresPreviewFeatures>]
type Lock = class
Public NotInheritable Class Lock
- 상속
-
Lock
- 특성
설명
클래스는 Lock 리소스에 대한 동시 액세스를 방지하기 위해 일반적으로 중요한 섹션이라고 하는 프로세스의 스레드 간에 상호 배타적인 액세스가 필요한 코드 영역을 정의하는 데 사용할 수 있습니다. 를 Lock
입력하고 종료할 수 있습니다. 여기서 enter와 exit 사이의 코드 영역은 잠금과 관련된 중요한 섹션입니다. 잠금에 들어가는 스레드는 잠금을 종료할 때까지 잠금을 보유하거나 소유한다고 합니다. 최대 하나의 스레드는 지정된 시간에 잠금을 유지할 수 있습니다. 스레드는 여러 잠금을 보유할 수 있습니다. 스레드는 재귀적으로 종료하기 전에 잠금을 여러 번 입력할 수 있습니다. 잠금을 즉시 입력할 수 없는 스레드는 잠금이 입력될 때까지 또는 지정된 시간 제한이 만료될 때까지 기다릴 수 있습니다.
또는 TryEnter 메서드를 Enter 사용하여 잠금을 입력하는 경우:
- 블록을 사용하여 C#과 같은 예외가 있는 경우에도 스레드가 잠금 Exit 을
try/finally
종료하는지 확인합니다. - C#
async
메서드에서 잠금을 입력하고 종료할 때 enter 및 exit 사이에 없음await
을 확인합니다. 잠금은 스레드에 의해 유지되며 다음 코드는await
다른 스레드에서 실행될 수 있습니다.
C# using
키워드(keyword) 같은 반환 Lock.Scope 된 를 자동으로 삭제하는 언어 구문과 함께 메서드를 사용 EnterScope 하거나 예외적인 경우 잠금이 종료되도록 C# lock
키워드(keyword) 사용하는 것이 좋습니다. 이러한 패턴은 및 Exit
를 사용하는 Enter/TryEnter
데 비해 성능상의 이점이 있을 수도 있습니다. 다음 코드 조각에서는 잠금을 입력하고 종료하기 위한 다양한 패턴을 보여 줍니다.
public sealed class ExampleDataStructure
{
private readonly Lock _lockObj = new();
public void Modify()
{
lock (_lockObj)
{
// Critical section associated with _lockObj
}
using (_lockObj.EnterScope())
{
// Critical section associated with _lockObj
}
_lockObj.Enter();
try
{
// Critical section associated with _lockObj
}
finally { _lockObj.Exit(); }
if (_lockObj.TryEnter())
{
try
{
// Critical section associated with _lockObj
}
finally { _lockObj.Exit(); }
}
}
}
C# lock
키워드(keyword) 사용하거나 잠금을 입력하고 종료하는 것과 유사한 경우 식의 형식은 정확하게 System.Threading.Lock
이어야 합니다. 식의 형식이 다른 것(예: Object
또는 과 같은 T
제네릭 형식)인 경우 교환할 수 없는 다른 구현을 대신 사용할 수 있습니다(예: Monitor). 자세한 내용은 관련 컴파일러 스펙렛을 참조하세요.
Interrupt 는 잠금을 입력하기 위해 대기 중인 스레드를 인터럽트할 수 있습니다. Windows STA 스레드에서 잠금을 대기하면 대기하는 동안 동일한 스레드에서 다른 코드를 실행할 수 있는 메시지 펌핑이 허용됩니다. 대기의 일부 기능은 사용자 지정 SynchronizationContext에 의해 재정의될 수 있습니다.
참고
재귀적으로 같은 여러 번을 포함하여 잠금에 들어가는 스레드는 잠금을 완전히 종료하고 다른 스레드가 잠금에 들어갈 수 있도록 잠금을 동일한 횟수만큼 종료해야 합니다. 를 보유 Lock
하는 동안 스레드가 종료되면 의 동작이 Lock
정의되지 않습니다.
주의
코드 경로에서 스레드가 여러 잠금을 종료하기 전에 입력할 수 있는 경우 동일한 스레드에서 두 잠금을 입력할 수 있는 모든 코드 경로가 동일한 순서로 입력되도록 합니다. 그렇지 않으면 교착 상태가 발생할 수 있습니다. 예를 들어 한 코드 경로 스레드 T1
에서 잠금 L1
을 입력한 다음 L2
잠금을 모두 종료하고 다른 코드 경로 스레드 T2
에서 두 잠금을 역순으로 입력하는 것이 좋습니다. 이 시나리오에서는 다음 이벤트 순서가 발생할 T1
수 있습니다. 를 입력하고L1
, 를 T2
입력 L2
T1
하고, 를 입력 L2
하고, 대기하고, 를 입력 L1
하고 대기 T2
합니다. 와 T2
사이에 T1
는 해결할 수 없는 교착 상태가 있으며, 나중에 잠금을 입력하려고 하는 다른 스레드도 중단됩니다.
생성자
Lock() |
Lock 클래스의 새 인스턴스를 초기화합니다. |
속성
IsHeldByCurrentThread |
잠금이 현재 스레드에 의해 유지되는지 여부를 나타내는 값을 가져옵니다. |
메서드
Enter() |
잠금을 입력할 수 있을 때까지 필요한 경우 대기하여 잠금을 입력합니다. |
EnterScope() |
잠금을 입력할 수 있을 때까지 필요한 경우 대기하여 잠금을 입력합니다. |
Equals(Object) |
지정된 개체가 현재 개체와 같은지 확인합니다. (다음에서 상속됨 Object) |
Exit() |
잠금을 종료합니다. |
GetHashCode() |
기본 해시 함수로 작동합니다. (다음에서 상속됨 Object) |
GetType() |
현재 인스턴스의 Type을 가져옵니다. (다음에서 상속됨 Object) |
MemberwiseClone() |
현재 Object의 단순 복사본을 만듭니다. (다음에서 상속됨 Object) |
ToString() |
현재 개체를 나타내는 문자열을 반환합니다. (다음에서 상속됨 Object) |
TryEnter() |
기다리지 않고 잠금을 입력하려고 시도합니다. |
TryEnter(Int32) |
잠금을 입력할 수 있을 때까지 지정된 시간(밀리초)에 대해 필요한 경우 대기하여 잠금을 입력하려고 시도합니다. |
TryEnter(TimeSpan) |
잠금을 입력할 수 있을 때까지 또는 지정된 시간 제한이 만료될 때까지 필요한 경우 대기하여 잠금을 입력하려고 시도합니다. |
적용 대상
.NET