2017-10-07 1 views
0

도와 주시겠습니까?함수 - 멀티 스레딩 환경에서 변수를 생성

Java에서 'f'라는 함수가 있습니다. 이 기능은 멀티 스레딩 환경

f() { 

SomeObject someO = new SomeObject(); 


    function1(someO); 
    . 
    . 
    . 
    function7(someO); 

} 

문제를 작동 : 첫번째 스레드가 함수 (F)에 입사하고 FUNCTION2 요법 FUNCTION1 호출 SomeObject의 새로운 인스턴스를 생성한다. 즉각적인 두 번째 스레드가 메소드에 들어가고 첫 번째 스레드가 작동 중일 때 SomeObject의 새로운 인스턴스를 작성합니다 4. 문제는 SomeObject의 인스턴스가 함수 5, 6, 7의 나머지 부분에서 첫 번째 스레드에 의해 처리된다는 것입니다.

+0

두 개의 서로 다른 스레드에서 호출하면 두 개의 다른 인스턴스가 만들어지며 두 개의 서로 다른 지역 변수에 할당되며 각 인스턴스는 각 함수에 전달됩니다. 그와 다른 일이 일어날 것이라고 생각하는 이유는 무엇이며 그 이유는 무엇입니까? – pvg

답변

1

첫 번째 스레드는 SomeObject (일명 some0)의 인스턴스를 로컬 변수로 가지므로 해당 스택 프레임에 국한되어 해당 스레드에 국한됩니다. 이 인스턴스는 some0 인스턴스 만 참조 할 수 있습니다.

f()를 호출하는 다른 스레드는 some0이라는 다른 인스턴스를 만들고 해당 인스턴스의 복사본 만 참조 할 수 있습니다.

다음은 로컬 변수에 대한 규칙입니다. some0이 인스턴스 변수 인 경우 (즉, f() 외부에서 선언 된 경우) f()의 정의를 보유하고있는 클래스의 동일한 인스턴스에서 f()를 호출하면 변수가 다른 스레드에 의해 참조 될 수 있습니다.

이러한 규칙이 있습니다. 여기에 더 자세한 설명이 나와 있습니다.

로컬 변수는 스택에 선언됩니다. 즉, 메서드 내에서 선언 된 변수의 경우 해당 메서드를 호출 할 때 '스택 프레임'에 참조 할 공간이 있습니다. 메서드가 호출 될 때마다 메서드의 모든 로컬 변수에 할당 된 스택의 공간이 있으므로 참조가 해당 메서드의 다른 호출과 구분됩니다. 따라서 다른 스레드가 메소드를 호출하면 로컬 변수에 대해 다른 스택 프레임을 얻습니다.

재귀 프로 시저에서 동일한 문제가 발생합니다. 즉, f()가 자신을 호출하는 경우입니다. 지역 변수 참조는 여전히 f()의 각 호출에 대해 분리되어있을 것이다. 즉, 각각의 재귀 호출은 그 자체의 복사본을 가질 것이다. 그렇지 않으면 재귀를 전혀 사용하는 것이 매우 어려울 것입니다.

+0

이 동작은 Java 언어 사양에 의해 보장된다는 점도 중요합니다. 일반적으로 이것은 이점입니다 : 지역 변수가 메쏘드를 호출 할 때마다 다시 생성되기 때문에 그들은 다른 호출과 메모리를 공유하지 않기 때문에 * thread safe *입니다. 이것은 종종 동시 프로그래밍에서 다른 스레드가 볼 수있는 위치에 게시 될 때까지 로컬 변수가 안전하다는 보장으로 사용됩니다. – markspace

0

첫 번째 스레드는 SomeObject의 첫 번째 인스턴스를 처리합니다. 모든 스레드가 자체 스택을 만듭니다. 그리고 그것이 호출하는 메소드와 그것이 생성하는 모든 로컬 객체는 그 스택에 살고 이러한 객체는 다른 스레드의 영향을받지 않습니다. 따라서 스레드 1에서 하나의 처리가 스레드 2 처리에 영향을 미치지 않습니다.

관련 문제