2013-06-21 3 views

답변

15

매개 변수는이 경우 두 개의 불변 값입니다. 메서드 내에서 메서드를 호출하는 여러 스레드가 각각 고유 한 스택 및 실행 컨텍스트를 갖기 때문에 단일 스레드 만 매개 변수 집합에서 작동합니다. 즉, 각 스레드는 자체 매개 변수 집합 및 로컬 변수를 가지므로 다른 매개 변수는 없습니다. 스레드는 이러한 변수에 영향을 줄 수 있습니다.

이와 같이 이것은 두 개의 변수과 관련하여 이라는 완전히 스레드 안전합니다.

ref에 의해 이 전달 된 매개 변수는 반드시 동기화가 필요한 두 개 이상의 스레드간에 단일 변수를 공유 할 수 있으므로 스레드 안전성이 반드시 필요하지 않습니다.

또한 매개 변수로 변경할 수없는 참조 유형 인스턴스 (예 : 사용자 정의 클래스)를 전달하면 해당 클래스의 내부 상태는 둘 이상의 스레드에서 잠재적으로 사용될 수 있으므로 동기화가 필요합니다. . 참조 자체은 (ref을 사용하지 않는 한) 복사본으로 전달되므로 스레드로부터 안전합니다.

+0

"정적 방법 내"를 의미합니까? 그렇다면 고맙습니다. 나는 – Adam

+2

@ Adam을 이해한다. 메소드가 정적인지 아닌지는 실제로 중요하지 않다. 같은 문제가 적용된다. (매개 변수 목록과 관련하여). –

+0

@Reed Ahh, 알겠습니다. 그러나 두번째 라인이''newStr = ...''''newStr''이 사유 재산이었던 경우, 그것은 쓰레드 문제를 일으킬 것입니다. 옳은? – Adam

5

매개 변수 자체는 정의에 따라 스레드로부터 안전합니다. 방법이 static인지 여부는 중요하지 않습니다.

그러나 다른 데이터를 참조 할 수는 있지만 자동으로 스레드로부터 안전하지는 않습니다.

이 예제에서는 값 유형과 변경 불가능한 참조 유형을 사용하므로이 특별한 경우는 정상입니다.

+0

(경고 :'System.String'은 진정으로 불변하지 않습니다.) .NET에서 const-correctness를 구현하지 않아서 감사합니다. –

+0

여기서 'const-correctness'가 무슨 뜻인지 궁금할까요? 내부적으로 const 구현에 대한 포인터입니까? 문자열 var를 재 지정할 때마다 old를 덮어 쓰지 않고 새 메모리 위치를 사용한다는 것을 알고 있습니다. – Vaibhav