2015-12-21 80 views
0

我的服務使用的單例類有問題。單身人士由2個服務人員進行通知。單身人士計算2個服務的2個變量。多個服務的Android單例

的問題是:

一個計數器只由第一服務和其他服務的第二個變量遞增儘管它持有的兩個變量是獨生子。我不明白爲什麼這兩個服務有不同的單例實例。

public static synchronized NotificationSingleton getInstance() { 

    if (mInstance == null) { 
     mInstance = new NotificationSingleton(); 
    } 
    return mInstance; 
} 

這應該返回單例的唯一實例。

+0

你如何訪問你的單身人士? –

+0

Just with getInstance()。我做了一個打印,以顯示是否創建了一個新實例,但只創建了一個實例。 – soMasu

+1

您的服務是否在同一個進程中運行(即:您的清單是否爲您的服務定義了'android:process')?你的單例是否有任何非靜態的嵌套類,你正在代碼中的其他地方實例化?另外,你是如何發現/確認你的單身人士有多個實例的? –

回答

1

你的單身實現不是線程安全的。這可能是問題所在。你應該嘗試與initialization on-demand holder

public class NotificationSingleton { 

    private static final class Holder { 
     private static final NotificationSingleton INSTANCE = new NotificationSingleton(); 
    } 

    public static NotificationSingleton getInstance() { 
     return Holder.INSTANCE; 
    } 

    private NotificationSingleton() {} 

} 
+0

請支持您的聲明爲什麼原始代碼段不是線程安全的。當然,這不是最高效的(因爲它可以從雙重檢查鎖定中受益),但是iirc,懶惰的初始化方法只會在Java 1.5以前的版本中出現微妙的錯誤。這些日子不應該成爲一個問題了。 –

0

嗯,我會的答案寫自己的問題:

的解決方案是將同樣採用Android添加:過程=「名稱」的所有服務的清單。他們都必須以相同的過程運行。