2014-02-16 1 views
1

List에서 인덱스로 요소를 가져 오는 것이 안전합니까?목록에서 인덱스로 요소를 가져 오는 것이 안전합니까?

var list = new List<int>(); 
... 
var a = list[i]; //executed from multiple threads. Should this be protected? 
+2

기본적으로 목록 구현에 따라 다릅니다. 'ArrayList'는 스레드 세이프가 아니며,'CopyOnWriteArrayList'는 ... –

+1

목록에서 요소를 가져 오는 경우에만 OK입니다. 목록 (설정, 추가, 제거)도 변경하는 경우 모음을 잠 가야합니다. –

+1

다른 작업에 따라 다릅니다. 동시 _reads_ 괜찮습니다. – SLaks

답변

5

그것은 절대적으로 안전 스레드 ... ...만큼 당신이 목록이 변경되지 않았는지 확인 할 수있다. 항목을 추가하는 것만으로도 "정의되지 않은"영토가 될 수 있습니다 (구현에 따라 다르긴하지만).

읽기 전용 - 예. 읽기 + 조작 : 아니오.

참고 : 목록 [5]가 동일한 개체 인 경우 lsit에서 항목을 변경하는 것이 좋습니다. 목록은 상관하지 않습니다. 그것이 작동 할 것이라고 말하는 것은 아닙니다. 왜냐하면 당신이 여기서 바꿀 내용에 따라리스트에있는 객체들과 계약을 맺을 것이기 때문입니다. int에 대해서는 분명히 업데이트하면 안됩니다.

1

원하는 작업에 따라 다릅니다.

읽기 - 완전히 안전합니다.

쓰기/편집 - 그래서 안전하지

밖으로 상자의 스레드에 Concurrent Collections로 분류 몇 컬렉션이 있습니다.

그러나 Concurrent Collection을 사용하는 대신 기존 List<T>을 동기화하는 것이 더 빠릅니다 (런타임시).

관련 문제