2012-10-20 2 views
3

정적 필드를 사용해야하고 스레드 안전성과 원자 적 연산을 정적 필드에 제공해야 할 경우 정적 필드를 함께 사용해야합니까? 정적 필드는 기본적으로 원자입니까? 예 :정적 필드를 사용하고 연동시켜야합니까?

Interlocked.Increment(ref Factory.DefectivePartsCount); 

감사합니다.

답변

3

예.

필드 (Int32라고 가정)는 원자 적이기 때문에가 아니라 정적이기 때문에 32 비트이기 때문입니다.

항상 Factory.DefectivePartsCount += 1은 변수에 대한 읽기 및 쓰기 작업이 필요하므로 전체 작업이 스레드로부터 안전하지 않습니다.

+0

32 비트 (32 비트 운영 체제 - windows?)는 무엇을 의미합니까? 만약 내가 64 비트 시스템을 사용한다면, 연산은 완전히 원자적일 것인가? – testCoder

+0

예, 64 비트를 타겟팅하면 Int64도 역시 원자 적입니다. 그러나 왜 그것에 의존 하는가? 그리고 _single_ 연산 만 원자적일 것입니다. –

+0

대단히 감사합니다. – testCoder

1

static은 thread-safety 측면에서 어떤 것도 보장하지 않습니다. 따라서 변수가 static이라도 증가분은 여전히 ​​원자가되지 않습니다. 따라서 상황에 따라 클래식 동기화 메커니즘을 사용해야합니다. 귀하의 경우 Interlocked.Increment은 괜찮습니다.