2016-08-31 3 views
2

싱글 톤 개체 및 동시 호출 이벤트를 처리 할 때 발생할 수있는 매우 구체적인 상황과 관련된 몇 가지 질문이 있습니다.메서드 - 로컬 변수는 어디에 저장되어 있습니까?

나는 다른 어떤 질문이 내 것과 관련되어 있다는 것을 알고 있지만, 나는 그들이 알고 싶었던 것이 아니다. (예 : Concurrently invoking Java method of singleton object) 예를 들어

말 나는이 다음 코드 :

public class MyClass{ 
    private static MyClass myInstance = new MyClass(); 

    private new MyClass() {} 

    public MyClass getInstance(){ 
     return myInstance; 
    } 

    public String doSomething(String message){ 
     java.util.Date d = new java.util.Date(); 
     System.out.println(message); 
     System.out.println("Today is: " + d); 
    } 
} 

동시 시나리오에서하는 나는이 같은 클래스 인스턴스에게 내가 날짜 d 어떻게되는지 알고 싶어 여러 번 호출하고 변수는 메모리 현명하고, getInstance()를 호출하는 모든 사람들을 위해 다른 메모리 스택에 저장 될 것인가? doSomething()?

클래스 인스턴스가 정적이기 때문에 정적으로 선언되었지만 변경할 수있는 전역 변수가 없으므로 병행 문제가없는 다른 프로세스에 대해 개별적인 d 개체를 생성해야한다고 선언되었습니다.

누군가이 부분을 명확히 할 수 있습니까?

+1

'싱글 톤'과 '개체'는이 질문과 관련이 없습니다. Java가 지역 변수를 어디에 두어야하는지 묻는다면 대답은 '스레드 스택'에 있습니다. – EJP

답변

2

당신 말이 맞습니다. 각 스레드는 자체 호출 스택과 d 참조가 있습니다. 힙에 할당 된 객체 자체이지만 escape analysis 변수가 로컬로 간주되는 경우 JIT 컴파일러가 스택에 배치 할 수도 있습니다. 귀하의 예제에서는 d에 대한 경합이 없으므로 doSomething은 스레드로부터 안전하다고 간주 될 수 있습니다.

"로컬"개체가 변경 가능한 공유 상태 (예 : 쓰기 가능한 정적 필드)로 읽기/쓰기 작업을 생성하는 경우 스레드가 서로 간섭 할 수 있음을 명심해야합니다.

관련 문제