2014-09-20 5 views
2

주문형 초기화 보유자 관용구에 의해 생성 된 싱글 톤을 사용하고 있습니다. 끝나면 다른 프로그램에서 사용할 수 있도록 싱글 톤을 "반환"하고 싶습니다. 다음과 같이 내가 Java에서 싱글 톤 인스턴스를 해제

는 싱글 다른 곳

public class MyObject{ 
    private MyObject(){} 
    private static class Holder{ 
     private static final MyObject INSTANCE = new MyObject(); 
    } 
    public static MyObject getInstance(){ 
     return Holder.INSTANCE; 
    } 
} 

만들기 ...이 작업을 수행 할 수 난 당신이 홀더 클래스가 필요한 이유 예 그게 아니라 확실히 작동합니다

MyObject myObject = MyObject.getInstance(); 
// do something 
myObject = null; 
System.gc(); 
+0

왜 싱글 톤 인스턴스를 파괴하려고하는지 이해하지 못합니까? – Lrrr

+0

[enum] (http://stackoverflow.com/questions/70689/) 대신 사용 하시겠습니까? – fredoverflow

+0

두 스레드가 실행 중입니다. 각 스레드는 수시로 MyObject 인스턴스에 액세스합니다. 나는 그것을 한 스레드에서 사용하고 그것을 풀어주지 않으면 다른 스레드에서 접근 할 수 없다. 아니면 사용중인 스레드에서 인스턴스를 제거할까요? – tip

답변

2

이 아무것도 달성하지 : 싱글 톤 객체는 항상 홀더 클래스의 마지막 인스턴스 필드에 의해 참조됩니다

myObject = null; 

를, 그리고 GCD 수 없습니다 않았다.

"싱글 톤"의 의미입니다. "싱글 톤"은 하나의 인스턴스 만 생성 된 클래스이며 인스턴스는 절대로 파괴되지 않습니다. 다른 것을 원하면 으로 문의하십시오. "싱글 톤"이라고하지 마십시오.

하나 이상의 스레드가 동시에 싱글 톤을 사용하지 못하도록하려면 어떤 형태의 상호 배타를 사용하거나, @Newerth가 말한 것을 원할 수도 있습니다. 개체 풀. GC가 힙에서 사용되지 않는 모든 개체를 재생하면서 중단 다른 모든 것들을 가져다 줄, 자바의 아주 초기에 System.gc();하지만, 현대의 JVM 연속 가비지 컬렉션을 수행


또한,이는 사용되지 않습니다 백그라운드에서. System.gc()에 대한 설명서가 변경되어 제안 인으로 변경되었습니다.

1

하여이를 사용 귀하의 초기화가 비용이 많이 드는 (아직) 것이 아니기 때문입니다. 나중에 생성자에 더 많은 것을 추가하려고한다면 다른 클래스를 갖기 위해 코드를 혼란스럽게 만듭니다.