나는 setter가 잠금 장치로 보호되어 있지만 getter 주위에는 아무런 잠금 장치가없는 속성이 있다고합니다. 쓰기 주변의 잠금이 다른 스레드에서 새로운 읽기를 보장합니까? (.Net, 메모리 모델)
private long _myField;
public long MyProperty
{
get { return _myField; }
set { lock(whatever) _myField = value; }
}
오히려 Monitor.Exit을 (그러나 판독) 글 동기 로크 또는 외에도
volatile write을 야기한다. 이제 두 개의 스레드 A와 B가 있다고 가정하면 다음 순서가 발생합니다.
- A는 현재 값
MyProperty
을 읽습니다. - B는
MyProperty
에 새 값을 씁니다. - A는
MyProperty
의 현재 값을 다시 읽습니다.
Q : 이제 A가 새로운 값을 볼 수 있습니까? 아니면 우리의 잠금 장치가 B가 주 메모리에 적시에 기록하도록 보장 하였지만, 다른 스레드가 새로운 값을 읽지는 않았는가? 아니면 우리가 .NET 2+ 또는 "약한"ECMA 구현에서 실행 중인지 여부에 따라 답변이 달라질 수 있습니까?
주 : OP 코드'value = _myField'는 실수 한 것처럼 보이므로 '_myField = value' (으)로 변경했습니다. –
RWLS의 요점은 무엇입니까? getter 및 setter의 lock 키워드는 * lots * 오버 헤드가 적은 두 개의 스레드에 대해서도 마찬가지로 작동합니다. –
@ hans-passant 더 많은 스레드가 동시에 읽히면 어떻게 될까요? –