2017-01-10 3 views
0

동일한 코드에서 2 개의 분리 된 잠금을 사용하는 것이 나쁜 코드 디자인인지 궁금합니다. 두 가지 잠금 장치가 처음 구현 된 이유는 업데이트 된 필드가 관련이 없다고 생각합니다. 동일한 방법으로 2 개의 잠금 장치가있는 것은 좋지 않습니까?

public class MyClass 
{ 
    private readonly object _lock = new object(); 
    private readonly object _lock2 = new object(); 

    public async Task DoStuff() 
    { 
    lock(_lock) 
    { 
     //do some stuff 
    } 
    lock(_lock2) 
    { 
     //do some other stuff 
    } 
    } 
} 

는의가 _lock는 만 int 변수를 수정하는 데 사용되며 _lock2이 수정 List<string> 변수에 사용한다고 가정 해 봅시다. 두 잠금은 다른 스레드의 클래스에있는 다른 메소드에서 호출 할 수 있습니다. 여기 교착 상태에 대한 냄새가 있습니까? 그것은 내가 refactor해야하므로 DoStuff 메서드는 하나의 잠금 유형을 사용해야합니다 것 같습니다.

+2

'lock'의 본문 내에 기다림이 없다면, 처음에는'async' 메쏘드로 잠그지 말아야한다. – Servy

답변

4

두 개의 코드 블록이 다른 호출에서 동시에 실행되고 있다면 두 개의 객체를 사용하는 데 아무런 문제가 없습니다. lock. 이 중요한 경우 두 블록을 동시에 실행할 수있는 경우 lock과 다른 개체가 있어야합니다. 두 블록이 실제로 동시에 실행되지 않고 전체 작업이 논리적으로 하나의 원자 적 조작으로 간주되는 것이 중요하다면 lock을 사용해야합니다.

두 옵션은 완전히 다른 의미를 가지며 본질적으로 잘못되거나 본질적으로 옳지 않습니다. 현재 상황에 맞는 것을 사용해야합니다.

0

그 코드는 안전한 데드 록입니다. 이 코드에서는 잠금을 사용하여 이미 중요한 섹션에있는 스레드가 스레드를 떠나지 않도록 할 수 있습니다. 그러므로이 쓰레드는 다른 쓰레드에 대해서 항상 획득 된 잠금을 해제 할 것이다.

관련 문제