2017-03-29 3 views
-2

getInstance를 실행하는 동안 OutOfmemory 오류가 발생합니다. 스레드 덤프를 확인하고 스레드가 BLOCKED (getInstance에서 모니터 잠금 대기 중)를 발견했습니다.OutOfMemory 오류 : 정적 메서드 내에서 동기화 된 블록

저는 멀티 스레딩에서 매우 초보자입니다. 아무도 아래의 구현이 정확하거나하지 않은 경우 설명해 주시겠습니까? 그렇지 않은 경우 어떻게 개선 할 수 있습니까?

class MyClass { 
    private static MyClass instance = new MyClass(); 
    public static MyClass getInstance() throws Exception { 
     synchronized (instance) {...} 
    } 
    public static MyClass clearInstance() throws Exception { 
     synchronized (instance) {...} 
    } 
} 
+1

정적 메서드 내부의 비 정적 필드를 어떻게 참조 할 수 있습니까? – shizhz

+0

@shizhz .. 죄송합니다. 코드를 업데이트했습니다! –

+0

만약 당신이'getInstance'와'clearInstance' 메소드의 구현을 게시한다면 더 좋을 것이라고 생각합니다. 그리고 문제를 재현하는 방법 :-) – shizhz

답변

0

이 멀티 스레딩에 대한 문제는 아니지만 당신이 Myclass의 객체를 생성 할 때 그것은 Myclass의 또 다른 객체를 생성 instance 변수 인스턴스를 가지고 있으며,이 끝없는 루프로 들어갑니다.

그래서 메모리 부족 또는 스택 오버플로 오류가 발생합니다.

+0

그래서 MyClass의 두 인스턴스에서 동기화해야합니까? –

+0

@Sanchit Khera 당신은 재귀 적으로 인스턴스를 만드는 객체의 인스턴스를 생성 할 수 없습니다. – TameHog

+0

'instance'는 인스턴스 멤버가 아니며 스택 오버 플로우가 언급되지 않았습니다. – EJP