我有一个返回多个实例的单例类,我无法弄清楚如何。很可能有多个线程调用单例类,但如果是这种情况,我不确定如何使其正常工作。这是一些代码。
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个实例,考虑到我如何设置它。有什么想法吗?
答案 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();
}
}
你永远不会发起一个单身人士,