Singleton返回多个实例

时间:2014-11-02 12:55:51

标签: java android singleton

我有一个返回多个实例的单例类,我无法弄清楚如何。很可能有多个线程调用单例类,但如果是这种情况,我不确定如何使其正常工作。这是一些代码。

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 个答案:

答案 0 :(得分:1)

正如@CommonsWare所猜测的那样,问题是我运行了两个进程,导致两个类加载器生效,这是单例进程的已知边界。解决方案是从我在类中使用的服务中删除android:process标记,以确保只有一个实例。

答案 1 :(得分: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();
    }
}

你永远不会发起一个单身人士,