잠금 내부 잠금
이 구성으로 인해 오류가 발생하는지 궁금합니다.
lock(sync)
{
// something
lock(sync)
{
//something
lock(sync)
{
//something
}
}
}
이 코드를 실행했는데 괜찮아 보이지만 상황에 따라 오류가 발생할 수 있습니까?
lock
Monitor.Enter
및에 대한 래퍼입니다Monitor.Exit
.
lock
키워드는 호출Enter
블록의 시작과Exit
블록의 끝에서. 전자 문서에서 :
동일한 스레드가
Enter
차단하지 않고 두 번 이상 호출하는 것은 합법적입니다 . 그러나Exit
객체에서 대기중인 다른 스레드가 차단 해제되기 전에 동일한 수의 호출 이 호출되어야합니다.
Enter
와 호출 Exit
이 쌍을 이루기 때문에 코드 패턴은 잘 정의 된 동작을 갖습니다.
그러나 lock
예외가없는 구조라고 보장 할 수는 없습니다.
A
ThreadInterruptedException
는 명령문Interrupt
입력을 기다리는 스레드를 인터럽트하는 경우 발생합니다lock
.
잘 정의 된 동작이고 절대 실패하지 않는 이유를 설명하려면 :
곁에 : 이 답변에는 잠금이 실제로 작동하는 방법에 대한 자세한 내용이 있습니다.
잠금은 Thread
레벨 에서 발생 하므로 동일한 스레드에서 두 번째로 호출하면 중복됩니다. .Net의 내부가 정확히 어떻게 작성되었는지에 따라 성능이 저하되지는 않을 것이라고 생각하므로 보장 할 수 없습니다.
클래스에서 다른 공용 함수를 호출하는 공용 함수가 여러 번 있는데, 둘 다 별도로 사용하면 잠금이 필요합니다. 이것이 허용되지 않으면 다음이 실패합니다.
private Dictionary<string, int> database = new Dictionary<string, int>();
private object databaseLock = new object();
public void AddOrUpdate(string item)
{
lock (databaseLock)
{
if (Exists(item))
database.Add(item, 1);
else
++database[item];
}
}
public bool Exists(string item)
{
lock (databaseLock)
{
//... Maybe some pre-processing of the key or item...
return database.ContainsKey(item);
}
}
MSDN ( 여기 및 여기 참조)에 따르면 이것은 잘 정의 된 동작이며 문제를 일으키지 않습니다.
참고 URL : https://stackoverflow.com/questions/9172934/lock-inside-lock
'Programing' 카테고리의 다른 글
DateTime.Now가 메서드가 아닌 속성 인 이유는 무엇입니까? (0) | 2020.12.13 |
---|---|
무엇을 (0) | 2020.12.13 |
쿼리, 네이티브 쿼리, 명명 된 쿼리 및 입력 된 쿼리의 차이점 (0) | 2020.12.13 |
HTML5` (0) | 2020.12.13 |
Pandas 데이터 프레임에 열로 numpy 배열 추가 (0) | 2020.12.13 |