0

我认为单例实例不应该被垃圾收集,但是我维护了一个单例对象,并在初始化时对其进行标记,如下所示:

private static LocalCache instance;

public LocalCache() {
    // initialize objects......
}

public static LocalCache getInstance() {
    if (instance == null) {
        instance = new LocalCache();
        Log.e("instance", "new");
    }
    return instance;
}

我发现这个日志在我的应用程序中出现了不止一次。更准确地说,我在 FragmentActivity 中有 5 个片段。当我按下主页按钮执行某些任务并切换回活动时,单例类似乎被重新分配。我的代码有问题吗?或者我可以阻止重新创建片段吗?我确定我没有将 null 分配给实例。

@Override
protected void finalize() throws Throwable {
    Log.e("finalize", "finalize");
}

我还重写finalize()以观察它何时被销毁,但日志没有出现在第二个“新实例”日志之前。

4

1 回答 1

5

我的代码有问题吗?

通常,对于单例,您使用synchronizedandvolatile进行锁定,以确保您不会由于多个线程上的并行调用而分配多个实例。或者,在您的情况下,只需使用静态初始化程序,因为您getInstance()不需要任何参数来实例化您的LocalCache.

但是,更有可能的是,这里的问题是您的进程已终止。一旦您不再处于前台,您的进程可以随时终止。当您的应用再次运行时,会创建一个新进程,并且所有静态数据成员最初都是null.

于 2013-07-22T18:00:49.737 回答