在java中释放单例的实例

时间:2014-09-20 10:12:28

标签: java multithreading singleton release

我正在使用按需初始化持有者习惯用法创建的单例。 当我完成后,我想“返回”单例,以便其他程序可以使用它。我可以这样做......

创建单身人士

public class MyObject{
    private MyObject(){}
    private static class Holder{
       private static final MyObject INSTANCE = new MyObject();
    }
    public static MyObject getInstance(){
       return Holder.INSTANCE;
    }
}

其他地方我用

MyObject myObject = MyObject.getInstance();
// do something
myObject = null;
System.gc();

2 个答案:

答案 0 :(得分:2)

这没有任何结果:

myObject = null;

单例对象将始终由Holder类中的最终INSTANCE字段引用,它永远不会是GCd。

事实上,那是什么" singleton"手段。 A"单身"是一个只创建一个实例的类,实例永远不会被销毁。如果你想要别的东西,那么调用它就别的了。别打电话给#34;单身。"

我敢打赌你要么想要使用某种形式的互斥来防止多个线程同时使用单例,要么你想要@Newerth所说的:对象池


此外,这已经过时了:System.gc();在Java的早期阶段,当GC从堆中回收所有未使用的对象时,它将使其他所有内容停止,但现代JVM会进行连续的垃圾收集在后台。 System.gc()的文档已更改为说它只是建议

答案 1 :(得分:1)

是的,这将有效,但不确定为什么你需要一个持有人类,因为你的初始化并不昂贵(还)。如果你打算稍后在构造函数中添加更多,那么很好,但是否则它只会使代码变得混乱而没有其他类。