在java Web应用程序容器中使用scala singleton是否安全?

时间:2014-06-26 10:58:34

标签: java scala singleton

我知道使用静态单例(见下面的代码)经常会导致内存泄漏。

public class Singleton {
    private static Singleton instance = new Singleton();

    public static Singleton getInstance() {
        return instance;
    }

    private Singleton() {
    }
}

我不知道很多细节,但在某处我读到静态变量包含到类加载器的链接,这就是为什么它们通常不会被垃圾收集器删除。

但scala单例在字节码中转换为静态变量。那么在java Web应用程序容器中使用scala单例对象是否安全?

1 个答案:

答案 0 :(得分:0)

  像这样的静态单例(见下面的代码)经常会导致内存泄漏。

Singleton应该导致内存泄漏没有特别的原因。

我会在Java中使用

enum Singleton { INSTANCE }

和scala

object Singleton { }
  

我读到静态变量包含到类加载器的链接,这就是为什么它们通常不被垃圾收集器删除。

GC将清理循环引用的对象,因此没有理由这样做。每个对象,每个类都有一个指向加载它的ClassLoader的链接。

ClassLoader cl = o.getClass().getClassLoader();

如果这是一个问题,类加载器将永远不会被卸载。