单例模式
饿汉式
public class Singleton { private static Singleton instance=null; private Singleton() {}; public static synchronized Singleton getInstance(){ if(instance==null){ instance=new Singleton(); } return instance; } }
线程安全,效率低,不推荐使用。
懒汉式
public class Singleton { private static Singleton instance=null; private Singleton() {}; public static Singleton getInstance(){ if(instance==null){ instance=new Singleton(); } return instance; } }
线程不安全,不可用
public class Singleton{ private static Singleton instance=null; private Singleton() {}; public static synchronized Singleton getInstance(){ if(instance==null){ instance=new Singleton(); } return instance; } }
线程安全,效率低,不推荐使用
懒汉式双重校验锁
public class Singleton { private static Singleton instance=null; private Singleton() {}; public static Singleton getInstance(){ if (instance == null) { //第一重校验,线程不安全,有多个线程可能同时得到Singleton的值为null, synchronized (Singleton.class) { //同步块代码,保证只有一条线程进入此方法 if (instance == null) { //此时创建了对象,其他线程进入的时候就会判断为false,直接返回以前创建的对象。 instance = new Singleton(); } } } return instance; } }
枚举式
public enum Singleton{ instance; private Singleton(){}; public void whateverMethod(){//自定义类中的方法 }; }
不仅能避免多线程同步问题,而且还能防止反序列化重新创建新的对象。推荐使用
使用方法:Singleton.instance.whateverMethod(); de>
内部类
public class SingletonIn { private SingletonIn() { } private static class SingletonInHodler { private static SingletonIn singletonIn = new SingletonIn(); } public static SingletonIn getSingletonIn() { return SingletonInHodler.singletonIn; } }
这种方式跟饿汉式方式采用的机制类似,但又有不同。两者都是采用了类装载的机制来保证初始化实例时只有一个线程。不同的地方:在饿汉式方式是只要Singleton类被装载就会实例化,内部类是在需要实例化时,调用getInstance方法,才会装载SingletonHolder类。
优点:避免了线程不安全,延迟加载,效率高。