2009-08-14 4 views
1

일반 스레드 안전 컬렉션을 갖고 싶습니다. 그리고 Arraylist는 정적 동기화 메서드로 스레드 안전성을 쉽게 사용할 수 있지만이 ArrayList는 일반적이지 않으므로 항상 버그가 있습니다. 따라서 항상 객체를 사용하고 싶습니다. 그들을 던지기. 이 작업을 수행하는 더 쉬운 방법이 있습니까? 또한 다른 목록 유형도 가능합니다. . "컬렉션을 열거하는 것은 아닌 스레드 안전 절차 모음을 동기화하는 경우에도, 다른 스레드가 여전히 컬렉션을 수정할 수 있습니다 본질적으로 스레드 안전 및 일반 arraylist?

입니다

:

+0

예, ArrayList를 다른 솔루션으로 랩핑 할 수 있습니까? :) –

답변

3

약간의 지식은 위험한 일이 ;-) 예, 메타 나이트의 제안을 사용하고 SyncRoot를 사용하지만, 당신이 조심해야 할 필요가 있었다 - 그것은 만병 통치약이 아니다. Microsoft의 BCL 팀 블로그 this post에서 SyncRoot과 같은 간단한 이유를 확인하십시오. 해당 게시물에서 따옴표 : 우리의 일반적인 컬렉션의

몇 기민한 사용자는 관찰 우리가 더 이상 이 ICollection<T>

에 공개 SyncRoot 속성을 제공하는 우리를 생각하지 더 사람은 더 많은 것을 약하게 동기화에 대해 더 많이 생각하게하는 것이 좋습니다. 솔직히 말해서 SyncRoot 일반 컬렉션의 속성은 값을 제공하지 않습니다.

물론 어떤 상황에서도 사용할 수 없다는 것은 아닙니다. 사용 사례를 신중하게 생각하고 자동 파일럿이 아닌 것으로 생각하면됩니다.

3

당신이 동기화 방법에 관한 MSDN에서 읽을 경우 여전히이 말한다있다 열거 형에서 스레드 안전성을 보장하기 위해 전체 열거 형에서 컬렉션을 잠 그거나 다른 스레드에서 변경 한 예외로 인해 예외를 잡을 수 있습니다. "

3

목록 (T) 래퍼를 만들고 SyncRoot 속성과 액세스를 동기화 할 수 있습니다.

MSDN 예 :

ICollection ic = ...; 
lock (ic.SyncRoot) 
{ 
    // Access the collection. 
}