最基本写法,也叫懒汉写法(线程不安全):
public class Singleton { private static Singleton singleton; private Singleton() { } public static Singleton getInstance() { if (singleton == null) { singleton = new Singleton(); } return singleton; } }
饿汉式写法(因为是静态的,再项目启动的时候就加载好了,每一次调用都是同一个,不存在线程安全问题):
public class Singleton { private static Singleton instance = new Singleton(); private Singleton (){} public static Singleton getInstance() { return instance; } }
例如:
public class Test { public static void main(String[] args) { Singleton.getInstance(); Singleton.getInstance(); } } class Singleton { private static Singleton instance = new Singleton(); private Singleton (){ System.out.println("我调用了"); } public static Singleton getInstance() { return instance; } }
结果:
静态内部类:
public class Singleton { private static class SingletonHolder { private static final Singleton INSTANCE = new Singleton(); } private Singleton (){} public static final Singleton getInstance() { return SingletonHolder.INSTANCE; } }
枚举:
public enum Singleton { INSTANCE; public void whateverMethod() { } }
这种方式是Effective Java作者Josh Bloch 提倡的方式,它不仅能避免多线程同步问题,而且还能防止反序列化重新创建新的对象,可谓是很坚强的壁垒啊,不过,jdk1.5中才加入enum特性
双重校验锁:
public class Singleton { private volatile static Singleton singleton; private Singleton (){} public static Singleton getSingleton() { if (singleton == null) { synchronized (Singleton.class) { if (singleton == null) { singleton = new Singleton(); } } } return singleton; } }
关于volatile关键字可以参考: