다른 스레드가 해당 개체에 대한 메서드를 실행하는 동안 개체 참조 무효화(.NET)
-
18-09-2019 - |
문제
(저는 .NET CLR에 관심이 있습니다)
한 스레드가 변수가 참조하는 개체를 변경하는 동안 다른 스레드가 원래 개체에 대해 메서드를 실행하면 정확히 무슨 일이 발생합니까?
예를 들어 다음 유형을 말해보세요. Foo
유형의 변수 'Bar'가 있습니다. Bar
, 그리고 Bar
클래스 수준 상태가 없습니다(적어도 지금은 이 시나리오를 간단하게 유지하고 싶습니다).
// Thread 1
foo.Bar = new Bar();
foo.Bar.SomeMethod();
그동안 실행이 완료되기 전에 ...
// Thread 2
foo.Bar = new Bar();
스레드 1에서 실행 중이던(이전?) 메서드는 어떻게 되나요?완료하는 데 필요한 모든 것이 이미 스택에 있습니까?
스레드 2가 대신 이 작업을 수행하면 상황이 바뀌나요?
foo.Bar = null;
해결책
통화가 이미 내부에 있도록 보장 된 경우 SomeMethod()
, 그러면 비정상적인 일이 일어나지 않을 것입니다. this
방법에 대한 암묵적인 인수이므로 필드 (또는 속성)의 가치를 직접 사용하지 않을 것입니다.
당신이 진정으로 그것을 보장 할 수 있는지 여부는 또 다른 문제입니다.
다른 팁
-- 편집하다:헷갈리는 문장을 바로잡았습니다.
글쎄, 실제로 변수에 할당하는 것은 원자가 될 것이므로, 전화가 갑자기 '오, 나는 null!' .somemethod ()를 실행하는 동안
무엇 ~할 수 있다 하지만 foo.Bar.SomeMethod() 자체는 호출되지 않습니다. 스레드 2가 (아마도) 이를 먼저 null로 설정하기 때문입니다.따라서 실행되지 않습니다(null ref 예외로 인해 충돌이 발생함).
첫 번째 예에도 동일하게 적용됩니다.새 객체에 대해 .SomeMethod를 호출하기만 하면 됩니다.
.SomeMethod가 실행되는 동안 상황이 바뀔 수 있다고 생각하시는 것 같은데요, 그렇죠?아니요.거기에서는 아무것도 변하지 않을 것입니다.그것은 여전히 그 자체의 맥락을 가질 것입니다.
한 스레드가 객체를 변수 참조로 변경하는 동안 다른 스레드가 원래 객체에서 메소드를 실행하는 경우 정확히 어떻게됩니까?
이 필드에 대한 액세스를 올바르게 동기화하기 위해 코드를 다시 작성하는 것이 발생합니다.