2012-07-18 2 views
18

변수 범위에 대한 질문이 있습니다. 예를 들어정적 메서드 및 스레드 안전의 로컬 변수

:

class A { 
    private static void test() { 
     // do something with local variables 
    } 
} 

는 이제 두 개의 스레드를 만들고, 각 스레드에 대한 A의 인스턴스를 생성합니다.

  1. 나는 각 스레드에 test() 전화, 나는 test()는 스레드로부터 안전하다는 것을 보장 할 수 있습니다?

  2. test()의 지역 품종은 어디에 저장되어 있습니까? 각 스레드의 스택? 힙 공간?

P. 이 경우에 정적은 완전히 무의미하다는 것을 압니다. 나는 레거시 코드에서 그것을 발견했다. 나는 내가 아는 것을 확실하게하고 싶어!

답변

28

로컬 변수는 각 스레드의 자체 스택에 저장됩니다. 즉, 로컬 변수는 절대로 스레드간에 공유되지 않습니다. 즉, 모든 로컬 원시 변수가 스레드로부터 안전하다는 것을 의미합니다.

개체에 대한 로컬 참조는 약간 다릅니다. 참조 자체는 공유되지 않습니다. 그러나 참조 된 객체는 각 스레드의 로컬 스택에 저장되지 않습니다. 모든 오브젝트는 공유 힙에 저장됩니다. 지역에서 생성 된 객체가 생성 된 메소드를 절대 이스케이프하지 않으면 스레드로부터 안전합니다. 실제로 이러한 메소드 나 오브젝트가 전달 된 객체를 다른 스레드에서 사용할 수 없게하는 한 다른 메소드와 객체로 전달할 수도 있습니다.

개체 구성원은 개체와 함께 힙에 저장됩니다. 따라서 두 스레드가 동일한 객체 인스턴스에 대해 메서드를 호출하고이 메서드가 객체 멤버를 업데이트하면 메서드는 스레드로부터 안전하지 않습니다.

스레드 안전성 확인 : 리소스가 만들어지고 사용되며 동일한 스레드의 제어 내에서 폐기되고이 스레드의 컨트롤을 벗어나지 않는 경우 해당 리소스의 사용은 스레드로부터 안전합니다.당신은 확실히 '패스'(신호), 다른 스레드에 개체 수 있지만 http://tutorials.jenkov.com/java-concurrency/thread-safety.html

+2

+1,하지만, 그것은 일반적으로, 그것의 예를 '소유권을 포기'해야 만든 스레드 :에서

. 자신의 참조를 널링하거나 다른 오브젝트를 작성하여이를 겹쳐 쓰므로 두 스레드가 같은 오브젝트에서 작동 할 수 없습니다. 이 작업이 완료되지 않은 경우 설명대로 오브젝트가 공유되며 액세스를 위해 잠금이 필요합니다. –

+0

예, 그렇기 때문에 참조를 null로 처리하여 개체를 삭제하는 것이 좋습니다. – Erol

+0

위대한 나는이 질문을하려고했다 !! – JohnMerlino

0

숫자 1의 경우 무엇이 test()인지 모르겠으므로 대답 할 수 없습니다. 클래스 A의 변수 static을 수정하면 스레드로부터 안전하지 않을 수 있습니다. 도중에 두 스레드가 동일한 객체에 대한 참조를 제공 받으면 객체가 정의 된 방법에 따라 스레드가 안전하지 않을 수 있습니다.

숫자 2의 경우 로컬 변수가 각 스레드의 스택에 있거나 (적어도 개념적으로 유사하므로) 로컬 변수가 다른 스레드에 의해 수정되는 것에 대해 걱정할 필요가 없습니다.

2

각 스레드에서 test()를 호출하면 test()가 스레드로부터 안전함을 보장 할 수 있습니까? 당신이 방법 로컬 변수에서 작업하는 시험() 메소드의 경우

예는 스레드 안전 할 것입니다.

test()에있는 지역 변수는 어디에 저장되어 있습니까? 각 스레드의 스택? 힙 공간?

메서드 로컬 변수는 각 스레드의 자체 스택에 저장됩니다.

관련 문제