在java中释放单例实例

在java中释放单例实例,java,multithreading,singleton,release,Java,Multithreading,Singleton,Release,我使用的是按需初始化持有者习惯用法创建的单例。 当我完成时,我想“返回”单例,以便其他程序可以使用它。我可以这样做吗 创建单例 public class MyObject{ private MyObject(){} private static class Holder{ private static final MyObject INSTANCE = new MyObject(); } public static MyObject getInsta

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

创建单例

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

是的,这会起作用,但不确定为什么需要holder类,因为您的初始化并不昂贵(目前)。如果以后要向构造函数添加更多内容,则可以,但如果没有其他类,则只会使代码变得混乱。

这不会产生任何效果:

myObject = null;
singleton对象将始终由Holder类中的final INSTANCE字段引用,并且它永远不会是GCd

事实上,“单身”就是这个意思。“singleton”是一个只为其创建一个实例的类,并且该实例永远不会被销毁。如果你想要别的东西,那就叫它别的吧。别叫它“单身汉”

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



而且,这是过时的:
System.gc()
在Java的早期,当GC从堆中回收所有未使用的对象时,它会使其他一切停止,但是现代JVM在后台进行连续的垃圾收集。System.gc()的文档已更改,表示这只是一个建议。

我不明白您为什么要销毁singleton实例?我可以建议改用吗?我有两个线程正在运行,每个线程都会不时访问MyObject实例。恐怕,如果我在一个线程中使用它而不释放它,我就无法从另一个线程访问它。或者它只是将我的实例从使用它的线程中移除?不,它将是两个线程使用的同一个实例。我想你需要的是这个。一个管理类的一个或多个实例的对象,您可以从中借用一个实例,稍后返回。@提示为什么要阻止两个线程使用您的单实例?如果你为你的问题提供更多的背景,这可能会有所帮助,因为人们目前正在猜测最佳解决方案,同时感觉缺少一些关键信息。到目前为止,正如詹姆斯·拉格(james large)指出的那样,听起来确实需要相互排斥。