2014-11-02 4 views
1

여러 인스턴스를 반환하는 싱글 톤 클래스가 있는데 어떻게 처리되는지 알 수 없습니다. 싱글 톤 클래스를 호출하는 스레드가 여러 개있을 가능성이 있지만, 그렇다면 어떻게 제대로 작동하게 할 수 있는지 잘 모르겠습니다. 여기에 몇 가지 코드가 있습니다.싱글 톤이 여러 인스턴스를 반환하는 경우

public class SomeClass{ 
    private static final String TAG="someClass"; 

    private volatile static SomeClass instance = new SomeClass(); 

    public static synchronized SomeClass getInstance() { 
     Log.v(TAG,"Returning instance "+instance); 
     return instance; 
    } 

    private SomeClass() { 
     //Some initialization here 
    } 
    @Override 
    public String toString() { 
     StringBuilder sb=new StringBuilder(); 
     sb.append("this="+System.identityHashCode(this)); 
     return sb.toString(); 
    } 
} 

그리고 내 로그는 다음과 같다 :

11-02 12:50:04.494: V/someClass(12882): Returning instance this=1386326216 
11-02 12:50:04.518: V/someClass(12900): Returning instance this=1384153464 

나는이 설정에있어 어떻게 주어, 나는 2 개 인스턴스를 가질 수있는 방법을 이해하지 않습니다. 어떤 아이디어?

+2

매니페스트에 'android : process' 속성이 있습니까? – CommonsWare

+0

'getInstance()'를 호출하는 곳에 코드를 추가하십시오. – Simas

+0

서비스에 대한 전화가있어 그 중 일부를 담당 할 수 있습니다. 음 ... – PearsonArtPhoto

답변

0

원래 코드는 실제로는 싱글 톤을 사용하지 않았습니다. 대신 클래스의 새 인스턴스를 만들고이를 정적 변수로 설정하여 정적 인스턴스를 변경했습니다. 아래 코드는 Singleton이 이미 설정되어 있는지 확인하고, Singleton이 설정되어 있으면 Singleton이 원래 클래스의 인스턴스를 반환합니다.

public class SomeClass{ 

    private volatile static SomeClass singleton = new SomeClass(); 

    public static synchronized SomeClass getSingleton() { 
     Log.v(TAG,"Returning instance "+singleton); 
     return singleton; 
    } 

    private SomeClass() { 
     if(singleton == null) { 
      singleton = this; 
     } else { 
      singleton = getSingleton(); 
     } 
    } 
    @Override 
    public String toString() { 
     StringBuilder sb=new StringBuilder(); 
     sb.append("this="+System.identityHashCode(this)); 
     return sb.toString(); 
    } 
} 

당신은 결코 싱글을 시작하지있어,

+0

죄송합니다. 공간을 놓쳤습니다. 코드를 적절히 편집 했으므로 ... – PearsonArtPhoto

+0

@PearsonArtPhoto 내 코드를 편집했습니다. – Hobbyist

+0

@ PearsonArtPhoto 내 코드를 편집했습니다. – Hobbyist

1

문제는 @CommonsWare는 추측으로, 내가 싱글로 알려진 경계하는 사실상 두 개의 클래스 로더를 일으키는 두 개의 프로세스가 실행해야한다는 것입니다 방법. 해결 방법은 클래스에서 사용하는 서비스에서 android:process 태그를 제거하여 인스턴스가 하나만 있는지 확인하는 것입니다.

관련 문제