2009-11-30 4 views
1

클래스에서 정적 ArrayList를 사용하여 업데이트 할 수없는 데이터베이스 필드에 대한 정보를 저장하고 있습니다. 한 번 (초기화 메서드 호출 생성자에서 잠금을 지키고) 생성자에서 초기화 할 계획이다. 그 후에 여러 스레드가 arraylist가 필드를 포함하는지 확인합니다. 이 읽기 액세스를 어떤 방식 으로든 제어해야합니까? 예를 들어, ArrayList.Synchronized를 호출하여.C# : 여러 스레드가 읽을 경우 ArrayList를 동기화해야합니까?

+1

MSDN은 친구입니다. "컬렉션이 수정되지 않는 한 ArrayList는 동시에 여러 독자를 지원할 수 있습니다." – RickNZ

답변

2

아니요 (static 생성자에서 수행하는 경우에만 생성해야합니다. which has an implicit multithread lock - 그렇게 할 수없는 위치에있는 경우 잠금을 설정하는 것이 좋습니다). R/W 액세스를 필요로하는 경우 액세스를 제어하는 ​​데 사용할 수 있다면 ReaderWriterLockSlim이 있습니다.

+1

"... 그리고 그 중 하나를 생성 할 때도 필요하지 않습니다 ..."- 사실이 아니라면 하나 이상의 기계 언어 명령 사이클이 포함되어 있고 여러 스레드에서 충돌 할 수 있으므로 실제로 액세스 할 필요가 없습니다. 그것. –

+0

@Charles : 좋은 점이 있습니다. (정적 생성자에 있어야한다고 말함) –

+0

@Ruben, righto, static ctor는 문제를 해결할 수있는 방법입니다. .. 내 DV를 제거했습니다 ... –

3

아니요, 내가 읽고있는 한 그 책을 가지고있을 수 있습니다.

+0

고맙습니다. 빠른 답변입니다. 여기에 키워드가 없다고 생각하십시오. 그렇지 않으면 답을 얻지 못했습니다. 응용 프로그램이 상당히 시간이 중요하기 때문에 액세스를 제어 할 필요가 없습니다. –

3

아니요. 동기화는 상태를 변경하려는 상태 보존 객체에만 필요합니다.

1

아니요. 스레드를 수정하지 못하도록 ReadOnlyCollection에 배치하는 것이 좋습니다.

편집 : 그러나 이렇게하려면 ArrayList 대신 목록을 List<T>으로 만들어야합니다.

0

목록을 처음 만들 때 정적 생성자를 사용할 수 있습니다. 이 유형에 대한 첫 번째 참조에서 한 번만 호출됩니다.

관련 문제