SyncRoot 대 동기화 우리는 해시 테이블과 ArrayList를 같이 .NET 수집 형의 일부에, 정적 메서드와 인스턴스 메서드의 SyncRoot, 그들 사이의 링크가 동기화 된 것을 알고? 어떻게 그들을 잘 활용을 할 수 있습니까?
우리는 해시 테이블, 예를 들어, 자신의 기본적인 사용법 보면 :
하프 타임 = Hashtable.Synchronized 해시 테이블 (새 새로운 해시 테이블 ());
잠금 (ht.SyncRoot)
{
// 어떤 행동
} 스레드 안전 해시 테이블을 반환 동기화 (1), 스레드 안전 해시 테이블의 어떤 종류입니까? 아래 우리는 .NET 소스 코드를 이해하기 시작합니다.
Hashtable의 정적 공용 (Hashtable의 표) 동기화
{
IF (표 == NULL)
{
상기 투사 경우 ArgumentNullException 새로운 새로운 ( "테이블")
}
새로운 새 SyncHashtable (표)을 반환하는 단계;
}
보기 쉬운 소스로부터 동기화 방법 반환형 실제로 SynchHashtable 인 예. 이 설명에서 쉽게 볼 스레드 안전 해시 테이블을 반환 동기화 우리가 말했다 정면에서, SynchHashtable는 해시 테이블에서 상속해야합니다. 우리는 아래를 확인합니다. SynchHashtable 입력 소스를 참조하십시오 : 코드
[직렬화]
개인 SyncHashtable 클래스 : Hashtable의
{
// 필드가
Hashtable의 _Table 보호;
// 메소드
내부 SyncHashtable (Hashtable를 표) 기본 상태 (false)
{
= this._table 테이블;
}
내부 SyncHashtable (SerializationInfo에 정보, StreamingContext 컨텍스트)베이스 (정보 컨텍스트)
{
this._table = (해시 테이블) info.GetValue ( "ParentTable"의 typeof (해시 테이블));
(this._table == 널)의 경우
{
(Environment.GetResourceString ( "Serialization_InsufficientState을")) 새로운 SerializationException을 던져;
}
}
공공 재정의 무효 추가 (개체 키, 개체 값)
{
잠금 (this._table.SyncRoot)
{
this._table.Add (키, 값);
}
}
공공 재정의 무효 취소 ()
{
잠금 (this._table.SyncRoot)
{
this._table.Clear ();
}
}
공공 재정의 개체 복제 ()
{
잠금 (this._table.SyncRoot는)
{
() ((해시 테이블) this._table.Clone) Hashtable.Synchronized를 반환;
}
}
공공 재정의 부울이 포함 (개체 키)
{
this._table.Contains (키) 반환;
}
공공 재정의 부울 ContainsKey (개체 키)
{
this._table.ContainsKey (키)를 반환;
}
공공 재정의 부울으로써 containsValue (개체 키)
{
잠금 (this._table.SyncRoot는)
{
this._table.ContainsValue (키) 반환;
}
}
공중 겹쳐 공극하는 CopyTo (배열 어레이의 INT arrayIndex)
{
로크 (this._table.SyncRoot)
{
this._table.CopyTo (배열 arrayIndex);
}
}
공공 재정의하여 IDictionaryEnumerator하는 GetEnumerator는 ()
{
) (this._table.GetEnumerator를 반환;
}
공공 재정의 무효 GetObjectData (SerializationInfo에 정보, StreamingContext 컨텍스트)
{
(정보 == NULL을)하는 경우
{
( "정보")를 새 경우 ArgumentNullException을 던져;
}
info.AddValue ( "ParentTable를"this._table의 typeof (해시 테이블));
}
공공 재정의 무효 OnDeserialization (개체를 보낸 사람)
{
}
공공 재정의 무효 제거 (개체 키)
{
잠금 (this._table.SyncRoot)
{
(키) this._table.Remove;
}
}
내부 대체 KeyValuePairs []는 ToKeyValuePairsArray ()
{
) (this._table.ToKeyValuePairsArray를 리턴;
}
// 속성
공공 재정의 INT 카운트
{
얻을
{
this._table.Count를 반환;
}
}
공공 재정의 부울 IsFixedSize는
{
얻을
{
this._table.IsFixedSize를 반환;
}
}
공공 재정의 부울 isReadOnly의는
{
얻을
{
this._table.IsReadOnly를 반환;
}
}
즉 IsSynchronized 부울 공공 재정의
{
얻을
{
TRUE를 반환;
}
}
공공 재정의 대상이 [오브젝트 키]
{
얻을
{
this._table [키]를 반환;
}
설정
{
로크 (this._table.SyncRoot)
{
this._table [키 = 값;
}
}
}
공공 재정의 ICollection에 키
{
얻을
{
잠금 (this._table.SyncRoot)
{
반환 this._table.Keys;
}
}
}
공공 재정의 객체 SyncRoot는
{
얻을
{
this._table.SyncRoot를 반환;
}
}
공공 재정의 ICollection이 값은
{
얻을
{
잠금 (this._table.SyncRoot)
{
반환 this._table.Values을;
}
}
}
}
축소 방법
아, 우리가 기대 정말로 무엇을 SyncHashtable 정말 그 방법 중 일부에서, 그들은 잠금을 추가하기 때문에 모든 스레드는 SyncHashtable의 안전한 작동을 달성하기 위해, 해시 테이블에서 상속, 우리가 어떤 스레드가 잠금 작업을 수행 할 알고, 그는 잠금을 해제하지 않은 전에, 다른 스레드는 상태에서 차단해야합니다. SyncHashtable은 달성하기 위해이 방법을 통해 스레드 안전 소위.
이제 우리는 의미와 동기화의 사용을 이해하고, 그 다음 우리는 그와 SyncRoot 사이의 관계를 살펴 봅니다.
SyncRoot 오브젝트 표현이 진정으로 자신의 사용을 이해하기 위해, 어려운이 설명은 이해하기, 정직하기 위해 해시 테이블에 대한 액세스를 동기화하는 데 사용할 수 있습니다 가져옵니다, 우리는 소스에서 시작해야합니다 : 공공 가상 객체 SyncRoot는
{
GET
{
IF (this._syncRoot == 널 (null) )
{
Interlocked.CompareExchange (REF this._syncRoot, 새로운 새 개체 ()는 null);
}
; this._syncRoot를 반환
}
}
당신이 연동 사용을 알고 있다면,이 코드는 이해하기 조금 어려운, 연동 여러 스레드가 원자 작업을 제공하는 변수를 공유 (불분명 친구 구글을 찾을 수있다). 원자 작업은 단일 스레드 작업입니다. 해시 테이블 경우에, 우리는 코드 어디에서나 전화 여부 같은 개체 유형의 모든 개체의 반환. 우리는과 동일한 잠금 (ht.SyncRoot) 및 낮은 운영 역할을 쓰기 시작
, 오브젝트 OBJ = 새 새 개체 () 정적
잠금 (OBJ)
{
// 일부 작업
}
정적 우리는 선언의 차이는 그들 사이에 객체 타입은 객체 레벨의 유형이며, SyncRoot 오브젝트 레벨이다.
위의 분석을 통해, 우리는 동기화 및 SyncRoot 사용을 이해할 수 있어야, 그들 사이의 관계는 다음과 같습니다
해시 테이블은 동기화 방법으로 잠금이 객체의 방법을 입력 SynchHashtable의 객체를 생성하기 위해 (this._table.SyncRoot는 ) 스레드 안전 작업을 구현하는이 코드는, this._table.SyncRoot는 SynchHashtable 개체 인스턴스에 반환 된 객체의 유형의 대상이다, 아무리 우리가 전화를 몇 번, 그는 독특한 없습니다.