2010-08-03 8 views
10

정적 메서드 내부의 변수에 대한 질문이 있습니다. 정적 메서드 내의 변수가 동일한 메모리 위치를 공유합니까, 아니면 별도의 메모리를 갖고 있습니까?정적 메서드 내에서 변수 공유

다음은 예입니다.

public class XYZ 
{ 
    Public Static int A(int value) 
    { 
     int b = value; 
     return b; 
    } 
} 

3 다르면 사용자 호출 동시에있어서에게

XYZ.A(10); 
XYZ.A(20); 
XYZ.A(30); 

을 실행한다. 각 호출의 반환 값은 무엇입니까?

XYZ.A(10)=? 
XYZ.A(20)=? 
XYZ.A(30)=? 
+0

참조 : http://stackoverflow.com/questions/420895/how-do-i-know-if-a-c-method-is-thread-safe –

+0

어떤 스레드를 사용하고 있습니까? –

답변

15

이들은 로컬 변수이므로 스레드간에 공유되지 않습니다. 그들이 정적 인 방법 안에 있다는 사실은 아무런 효과가 없습니다. 당신이 중간 변수로 정적 변수를 사용하는 경우

, 안전하지 않은 것 : 여기

public class XYZ 
{ 
    // Don't do this! Horribly unsafe! 
    private static int b; 
    public static int A(int value) 
    { 
     b = value; 
     return b; 
    } 
} 

, 당신은 전화 그래서 만약 모든 스레드가 진정으로, 같은 b 변수를 사용하는 것 메서드를 여러 스레드에서 동시에 실행하면 스레드 X는 b에 스레드 Y가이어서 스레드 X가 스레드 Y가 설정 한 값을 반환하도록 끝낼 수 있습니다.

4

변수가 스택에 전부 있기 때문에 스레드는 서로의 값을 덮어 쓰지 않습니다. 각 스레드에는 별도의 스택이 있습니다.

1

이 방법은 스레드로부터 안전한 방법은 아니지만 모두 자동 가변 기능은 함수가 호출 될 때마다 자동으로 스레드로부터 안전합니다. 새 스택 프레임을 얻습니다. 모든 지역 주민들은 기능을 시작했을 때 만들어지며 퇴역시 파괴됩니다. 정적 스토리지를 사용했다면 위와 같이 예상치 못한 결과가 발생합니다.

1

아니요, 이들은 메모리에서 동일한 공간을 공유하지 않습니다. 귀하의 전화 문의에 대해, 그들은 (귀하가 나열한 순서대로) 반환 할 것입니다 : 10, 2030.

솔직히 (당신은 그냥 아무것도 안하고, 값을 할당하고 있기 때문에), 코드와이 어떤 경우에 사실 일 것이나 고려 :

Class XYZ 
{ 
    public static int A (int value) 
    { 
     b += value; \\Won't compile: b not initialized 
     return b; 
    } 
} 

또는

Class XYZ 
{ 
    public static int A (int value) 
    { 
     int b = 0; \\Initialized 'b' for each call 
     b += value; 
     return b; 
    } 
} 

Static 메서드는 인스턴스 변수에 액세스 할 수 없으므로 (적어도 인스턴스에 대한 참조가없는 것은 아닙니다) 정적 메서드에서 변수를 초기화하려면 코드를 호출 할 때마다 다시 초기화하지 않아도됩니다. 정적 메서드가 변수를 변경할 수있게하려면 서로 작동하기 위해 두 값을 전달해야합니다.

+0

물론 정적 변수가 없다면 말입니다. –

+0

참. 그것들을 너무 드물게 사용하여 그들을 잊어 버렸습니다 ...이 특정한 질문에 대해서는, 그것은 문제처럼 보이지 않습니다. – AllenG

관련 문제