2014-09-20 132 views
2

我正在使用由按需初始化持有人成语创建的单例。 当我完成后,我想“返回”单身人士,以便它可以被其他程序使用。我能做到这一点如下...在java中释放单例的实例

创建辛格尔顿

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(); 
+0

我不明白你为什么要破坏你的单身实例吗? – Lrrr 2014-09-20 10:20:44

+0

我可以建议使用[an enum](http://stackoverflow.com/questions/70689/)吗? – fredoverflow 2014-09-20 10:24:48

+0

我有两个线程正在运行,每个线程都会不时访问MyObject实例。我很害怕,如果我在一个线程中使用它而不释放它,我无法从另一个线程访问它。或者它会让我的实例远离正在使用的线程? – tip 2014-09-20 10:25:06

回答

2

这无所作为:

myObject = null; 

的单对象将始终由终审场在Holder类引用,而且永远不会是GCD。

事实上,这就是“单身”的含义。一个“singleton”是一个只创建了一个实例的类,并且该实例从不被销毁。如果你想要别的东西,那么就叫吧。不要称之为“单身人士”。

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


此外,这是过时的:System.gc();在Java中的最早期,它将使一切停顿,而GC回收所有从堆未使用的对象,但是现代JVM做持续的垃圾收集在背景中。 System.gc()的文档已被更改,说它只是一个建议

1

是,将工作,但不知道为什么你需要一个holder类因为你的初始化并不昂贵(还)。如果你打算在后面添加更多的构造函数,那很好,但否则它会使代码混乱以让其他类。