2009-04-27 6 views
1

최근에 내 친구 중 누가 단순히 보조 객체를 사용하여 참조하는 객체를 잠 그거나 잠그는 것의 차이점을 스레딩하기 시작했는지 묻습니다. 나는 전혀 몰랐다는 것을 인정해야만했다. 누가 말해 줄 수 있니? 나는 시도하고 코드 조각의 부부와 함께 선보일 예정 :지정한 개체를 잠그고 보조 개체를 잠그는 것의 차이점은 무엇입니까?

첫 번째 방법 :

List<string> data = new List<string>(); 
object datalock = new object(); 

void main() 
{ 
    lock(datalock) 
    { 
     if (data.contains("SomeSearchString")) 
     { 
      //Do something with the data and then remove it 
     } 
    } 
} 

두 번째 방법 :

List<string> data = new List<string>(); 

void main() 
{ 
    lock(data) 
    { 
     if (data.contains("SomeSearchString")) 
     { 
      //Do something with the data and then remove it 
     } 
    } 
} 

상당한 차이가있는 경우, 또는이 개인 코딩 스타일까지입니까? 중요한 차이가 있다면, 누구나 그것이 무엇인지 설명 할 수 있습니까?

다른 질문 [Difference between lock(locker) and lock(variable_which_I_am_using)]을 통해 나왔습니다. 그 대답은 둘 다 동등하다고 암시했지만, 그렇다면 사용하기 가장 좋은 이유는 무엇입니까?

그물 주변에 수많은 예제가 흩어져있는 것을 보았습니다. 첫 번째 방법을 개인적인 선택으로 사용하는 경향이 있지만 두 번째 방법을 사용할 때 얻을 수있는 이점이 무엇인지 궁금합니다.

답변

5

가장 큰 차이점은 코드에 대한을 알고있는 보조 객체 과에 대해 잠금 다른 코드 (안 당신)에서 예기치 않은 결과 (교착 상태, 펄스/대기 개는, 등)의 위험이 없다는 것입니다 기본 객체 (다른 코드에서 일반적으로 사용 가능). IMO

는, 아마도 CLR 팀은 명시 적 Lock 유형을 잘 할 것 - 또는 어쩌면 Monitor이 비 정적 했어야 등

+0

방금 ​​입력 한 것입니다 ... 내가 추가하려고했던 유일한 것은 기본 객체에 대한 잠금이 수퍼 클래스 잠금 전략에 참여하는 것을 알고있는 하위 클래스가 허용한다는 것이고, 약간 더 많은 유연성을 제공합니다 그러나 그들이하는 일을 모르는 소비자는 추가적인 문제를 야기 할 수 있습니다. –

1

가장 중요한 점은 마크에 의해 덮여되었지만 내가 선호하는 첫 번째 패턴은 읽기 및 쓰기 잠금을위한 별도의 객체 또는 특정 용도에 유용 할 수있는 기타 세분화 수준을위한 범위를 열어주기 때문입니다.

+0

나는 그것이 잠금이 해제되기를 기다리는 대신에 잠금이 놓여있는 동안 대상 객체의 자식 메소드가 여전히 액세스 될 수 있다고 생각한다. – BenAlabaster

0

기본적으로 차이는 없습니다. 모든 스레드가 안전하지 않은 조작이 동일한 오브젝트를 잠근다면 차이는 없습니다. 그러나 구현 관점에서 차이점이있을 수 있습니다. 다른 스레드가 독점 잠금이 필요한 객체에 대한 액세스가 필요한 경우 해당 동기화 객체를 사용할 수있게하고 잠글 필요가있는 객체를 명확히해야합니다.

반면에 실제로 잠금 블록 내 다른 값에 값을 할당 할 수있는 경우가 있습니다. 이 경우 분명히 관련이없는 객체를 잠글 필요가 있습니다.

그것은 잠 서로 다른 객체를 사용하여 개인적인 취향과 유지 보수 (필요한 두 번째 객체, 나쁜 생각, 또는 둘 다에 고정되어?)

0

모두 내려 오는 더 동기화 세분화과 성능을 할 수 있습니다. 동일한 객체에서 잠그면 한 작업에서 불필요하게 다른 객체를 차단할 수 있습니다. lock (this)을 사용하면 모든 동시 작업은 잠금이 설정된 작업을 해제 할 때까지 대기해야합니다. 그러나 일부 작업은 동일한 리소스에 액세스하지 않을 수도 있으므로이 작업이 필요하지 않을 수도 있습니다. 그래서 당신은 불필요하게 그들을 잠그고있어 성능을 해치고 있습니다. 대신 공유 리소스의 여러 그룹에 대해 서로 다른 동기화 개체를 사용하고 작업에서 액세스해야하는 리소스에 해당하는 잠금을 사용하게하십시오.

관련 문제