一、 /** * lazy man(不是线程安全的) * @author TMAC-J * */ public class Singleton { private static Singleton instance; private Singleton(){} public static Singleton getInstance(){ if(instance!=null){ instance = new Singleton(); } return instance; } } 二、 /** * lazy man(线程安全) * @author TMAC-J * */ public class Singleton { private static Singleton instance; private Singleton(){} public static synchronized Singleton getInstance(){ if(instance!=null){ instance = new Singleton(); } return instance; } } 三、 /** * hungry man(天生线程安全,缺点是类加载的时候就会实例化) * @author TMAC-J * */ public class Singleton { private static Singleton instance = new Singleton(); private Singleton(){} public static Singleton getInstance(){ return instance; } } 四、 这种写法和上面效果一样 public class Singleton { private Singleton instance = null; static { instance = new Singleton(); } private Singleton (){} public static Singleton getInstance() { return this.instance; } } 五、 /** * 静态内部类 * * @author TMAC-J * */ public class Singleton { private static class SingletonHolder { private static final Singleton instance = new Singleton(); } private Singleton(){}; public static final Singleton getSinleton(){ return SingletonHolder.instance; } } 六、 public enum Singleton { INSTANCE; } 七、 /** * 双重锁 * * @author TMAC-J * */ public class Singleton { private static Singleton instance;
private Singleton(){}
public static Singleton getInstance(){ if(instance == null){ synchronized (Singleton.class) { if(instance == null){ instance = new Singleton(); } } } return instance; } } 最常用的就是双重锁了,效率还可以