아니요, 같은 물건을 잠그는 동안은 아닙니다. 재귀 코드는 효과적으로 이미 잠금 을 가지고 있으므로 방해받지 않고 계속할 수 있습니다.
lock(object) {...}
Monitor 클래스 를 사용하는 약어입니다 . 으로 마크가 지적 , Monitor
수 재진입 그래서 객체에 잠금 시도를 반복, 현재의 thread가 이미 잠금이있는 잘 작동됩니다.
다른 물체를 잠그기 시작 하면주의해야합니다. 다음 사항에 특히주의하십시오.
- 항상 동일한 시퀀스에서 주어진 수의 개체에 대한 잠금을 획득합니다.
- 잠금 을 획득하는 방법 과 반대 순서로 항상 잠금을 해제하십시오 .
이러한 규칙 중 하나를 위반하면 어느 시점에서 교착 상태 문제가 발생할 수 있습니다.
다음은 .NET의 스레드 동기화를 설명하는 좋은 웹 페이지입니다. http://dotnetdebug.net/2005/07/20/monitor-class-avoiding-deadlocks/
또한 한 번에 가능한 적은 수의 개체를 잠급니다. 가능하면 거친 잠금을 적용 하는 것이 좋습니다. 개체 그래프가 있고 해당 개체 그래프의 루트에 대한 잠금을 획득 할 수 있도록 코드를 작성할 수 있다면 그렇게하세요. 즉, 해당 루트 개체에 대해 하나의 잠금이 있으므로 잠금을 획득 / 해제하는 순서에 대해별로 걱정할 필요가 없습니다.
(참고로, 귀하의 예제는 기술적으로 재귀 적이 지 않습니다. 재귀 Bar()
적이려면 일반적으로 반복의 일부로 자신을 호출해야합니다.)