MS 링크:하이퍼링크 로그인이 보입니다.
휘발성 키워드는 여러 스레드가 동시에 실행될 경우 필드를 수정할 수 있음을 나타냅니다. 휘발성으로 선언된 필드는 컴파일러 최적화에 의해 제한되지 않습니다(단일 스레드에 의해 접근된다고 가정할 때). 이렇게 하면 필드가 항상 최신 값으로 렌더링됩니다.
휘발성 수정자는 일반적으로 여러 스레드가 접근하지만 락 문으로 접근을 직렬화하지 않는 필드에 사용됩니다.
휘발성 키워드는 다음과 같은 유형의 필드에 적용할 수 있습니다:
- 인용 유형.
- 포인터 타입(안전하지 않은 맥락에서). 포인터 자체는 가변될 수 있지만, 가리키는 객체는 가변할 수 없다는 점에 유의하세요. 즉, "가변 객체에 대한 포인터"는 선언할 수 없다.
- sbyte, byte, short, ushort, int, uint, uint, char, float, bool 같은 유형이 있습니다.
- 다음 기본 타입 중 하나를 가진 열거 타입: 바이트, 스바이트, 쇼트, 유쇼트, 연수, 또는 유인트.
- 참조 타입으로 알려진 일반 타입 파라미터들.
- IntPtr과 UIntPtr.
변수 키워드는 클래스나 구조체의 필드에만 적용할 수 있습니다.국소 변수는 휘발성으로 선언할 수 없습니다。
더 이상 쓸데없는 말 없이, 테스트할 루프를 작성해 보세요:
10,000번 반복해서 테스트해봅시다,A 값의 출력이 올바르다는 것을 발견했으나,설명이 안 돼volatile은 스레드 안전입니다왜냐하면 여러 번 테스트하면 계산 오류가 생긴다는 것을 알게 될 테니까요! 왜냐하면 올바른 결과가 나올 확률과 틀릴 가능성이 있기 때문입니다
코드:
다시 100,000개의 루프를 테스트해 보면, a의 값이 틀렸다는 것을 알 수 있습니다. 루프 수가 적을수록 오류 발생 확률이 낮아지고, 오차가 그렇게 명확하지 않기 때문입니다. 마치 방금 10,000번 루프 후에 오류가 없었던 것과 같습니다.
이때 자물쇠를 추가해 테스트하면, a의 값이 우리가 예상한 대로 올바르게 계산된 것을 알 수 있습니다.
코드:
요약: 위 예시에서 볼 수 있듯이 volatile은 스레드 안전을 보장하지 않습니다.
|