2010-07-08 2 views

답변

3

보통은 별도의에 고정하는 것이 가장 좋습니다 (불변) 개체 ... 수정중인 동일한 개체에 잠금 은주의로 수행해야합니다. 을 수행해야합니다. 이 같은 기본 경우

private readonly object sync = new object(); 
private List<object> list = new List<object>(); 

void MultiThreadedMethod(object val) 
{ 
    lock(sync) 
    { 
     list.Add(val); 
    } 
} 

당신은 문제가을 가지고 있지만하지 않습니다 다음 목록은 변경 될 수있는 가능성 (안 목록의 내용,하지만 목록 자체),이 경우 두 개체를 잠그려고 할 때 두 개체를 잠그는 상황이 발생할 수 있습니다.

+1

이것은 사실이 아닙니다. 악의적 인 관행은 다른 코드에 공개적으로 노출되어있는 객체를 잠그는 것입니다. 이 콜렉션이 공유된다면, 그렇습니다. 다른 코드가 당신을 감금 할 수 있기 때문에 락킹하는 것은 나쁜 습관입니다. 그러나 컬렉션이 완전히 포함 된 경우 동기화 할 수있는 좋은 후보인 경우 전화를 걸 수 있습니다. – codekaizen

+2

@codekaizen : List *에서 수행 할 코드 *가 무엇인지 알지 못해 ... 참고가 누출 될 수 있습니다. 당신은이 대답이 옳지 않다고 말하는 것이 옳다. 개인 객체 사용에 대한 요점은 불변성에 관한 것이 아니라 내부의 데이터가 변경 되더라도 같은 모니터에서 잠글 것입니다. 그것은 다른 코드가 동일한 모니터에 액세스 할 수 있는지 여부와 자체 모니터에서 잠글 수 있는지 여부입니다. –

+0

@codekaizen, 잘 "나쁜 연습"은 강한 레이블이지만, 요점은 같은 개체에 대한 잠금이 *주의 *로 수행되어야한다는 것입니다. – Kiril

1

예. 그러나 Add 메서드를 통해 List 및 "new"를 서브 클래 싱하는 것을 고려할 수도 있습니다. 그러면 자물쇠를 캡슐에 넣을 수 있습니다. 아무것도 기본 목록에 액세스하지 않는 한 훌륭한 작동합니다. 이 기술은 XNA 비디오 게임의 간단한 트리 구조에 사용됩니다.