1,饿汉式 (静态变量----线程安全)
//饿汉式单例模式 public class Singleton { private final static Singleton instance = new Singleton(); private Singleton(){} public static Singleton getInstance(){ return s; } }
2,饿汉式(静态代码块----线程安全)
public class Singleton { private static Singleton instance; static { instance = new Singleton(); } private Singleton() {} public Singleton getInstance() { return instance; } }
优点:简单粗暴,加载类时直接实例化这个类,避免线程同步。
缺点:资源效率不高,可能getInstance()永远不会执行到,但执行该类的其他静态方法或者加载了该类(class.forName),那么这个实例任然初始化。
3,懒汉式(线程不安全----不添加锁机制)
public class Singleton { private static Singleton singleton; private Singleton() {} public static Singleton getInstance() { if(singleton== null){ singleton = new Singleton(); } return singleton; } }4,懒汉式(方法同步----添加同步锁)
public class Singleton { private static Singleton singleton; private Singleton() {} public static synchronized Singleton getInstance() { if (singleton == null) { singleton = new Singleton(); } return singleton; } }
5,懒汉式(线程安全----同步代码块)
public class Singleton { private static Singleton singleton; private Singleton() {} public static Singleton getInstance() { if (singleton == null) { synchronized (Singleton.class) { singleton = new Singleton(); } } return singleton; } }
6,双重检查
public class Singleton { private static volatile Singleton singleton; private Singleton() {} public static Singleton getInstance() { if (singleton == null) { synchronized (Singleton.class) { if (singleton == null) { singleton = new Singleton(); } } } return singleton; } }
7,静态内部类
public class Singleton { private Singleton() {} private static class SingletonInstance { private static final Singleton INSTANCE = new Singleton(); } public static Singleton getInstance() { return SingletonInstance.INSTANCE; } }
8,枚举
public enum Singleton { INSTANCE; public void whateverMethod() { } }
提示:一般采用饿汉式,若对资源十分在意可以采用静态内部类,不建议采用懒汉式及双重检测。