虽然这两种解决方案都没有什么特别的问题,但维基百科的这个解决方案应该给你最好的兼容性,并给你一个线程安全的单例:
马里兰大学计算机科学研究员 Bill Pugh 撰写了有关在 Java 中实现单例模式时的代码问题。 [11] Pugh 在“双重检查锁定”习语上的努力导致了 Java 5 中 Java 内存模型的变化,以及通常被认为是在 Java 中实现 Singleton 的标准方法。被称为按需初始化持有者习惯用法的技术尽可能地懒惰,并且适用于所有已知的 Java 版本。它利用了关于类初始化的语言保证,因此可以在所有符合 Java 的编译器和虚拟机中正常工作。嵌套类的引用不早于调用 getInstance() 的那一刻(因此类加载器不早于加载)。因此,
public class Singleton {
// Private constructor prevents instantiation from other classes
private Singleton() { }
/**
* SingletonHolder is loaded on the first execution of Singleton.getInstance()
* or the first access to SingletonHolder.INSTANCE, not before.
*/
private static class SingletonHolder {
public static final Singleton INSTANCE = new Singleton();
}
public static Singleton getInstance() {
return SingletonHolder.INSTANCE;
}
}