2014-09-20 100 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類因爲你的初始化並不昂貴(還)。如果你打算在後面添加更多的構造函數,那很好,但否則它會使代碼混亂以讓其他類。