2014-11-02 56 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 2014-11-02 13:04:49

+0

添加您調用'getInstance()'的代碼。 – Simas 2014-11-02 13:08:49

+0

我確實有一個服務,可以負責進行這些調用。嗯... – PearsonArtPhoto 2014-11-02 13:09:24

回答

0

原始代碼從來沒有實際使用過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(); 
    } 
} 

你永遠發起一個Singleton,

+0

對不起,我錯過了一個空間。編輯適當的代碼,所以... – PearsonArtPhoto 2014-11-02 13:08:20

+0

@PearsonArtPhoto我編輯我的代碼,這應該工作。 – Hobbyist 2014-11-02 13:12:03

+0

@PearsonArtPhoto我編輯我的代碼,這應該工作。 – Hobbyist 2014-11-02 13:12:36

1

的問題,如@CommonsWare猜到了,就是我有兩個進程在運行,使兩個類加載器的效果,這是一個已知的邊界單身處理。解決方法是從我在我的課程中使用的服務中刪除android:process標記,以確保只有一個實例。