- 传统的实现方法:两私一公,涉及线程安全问题(即使有多重检查锁也可以通过反射破坏单例)
public class Singleton { private volatile static Singleton instance = null; private Singleton () { } public static Singleton getSingleton() { if(instance == null) { synchronized(Singleton.class) { if(instance == null) { instance = new Singleton(); } } } return instance; } }
- JDK1.5以前
public class Singleton { private static class SingletonInstance { private static final Singleton instance = new Singleton(); } private Singleton() { } public static Singleton getSingleton() { return SingletonInstance.instance; } }
- 目前最为安全的实现单例的方法是通过内部静态enum的方法来实现,因为JVM会保证enum不能被反射并且构造器方法只执行一次。
public class Singleton { private Singleton() {} public static Singleton getInstance() { return SingletonEnum.INSTANCE.getInstance(); } private static enum SingletonEnum { INSTANCE; private Singleton singleton = null; private SingletonEnum() { singleton = new Singleton(); } public Singleton getInstance() { return this.singleton; } } public static void main(String[] args) { Singleton singleton1 = Singleton.getInstance(); Singleton singleton2 = Singleton.getInstance(); System.out.println("singleton1==singleton2? " + (singleton1==singleton2)); } }
时间: 2024-08-07 21:16:48