常用的单例模式
- 饿汉模式
特点:在类加载时就完成了初始化,所以类加载比较慢,但获取对象但速度快,并且避免了多线程同步问题
public class Singleton { private static Singleton instance = new Singleton(); private Singleton (){ } public static Singleton getInstance() { return instance; } }
-
双重检查模式
public class Singleton{ private volatile static Singleton singleton; //volatile 保证了不同线程对这个变量进行操作时的可见性,即一个线程修改了某个变量的值,这新值对其他线程来说是立即可见的。禁止进行指令重排序。 private Singleton(){ } public static Singleton getInstance(){ if(singleton == null){ //判空 为了避免不必要的同步 synchronized (Singleton.class){ if(singleton == null){ //在Singleton 为null时,在创建实例 singleton = new Singleton(); } } } return singleton; } }
-
静态内部类单例模式 特点:第一次加载Singleton类时并不会初始化sintens,只有第一次调用getInstance()时虚拟机加载SingletonHolder并初始化sintens,这样不仅能确保线程安全也能保证Singleton类的唯一性,所以推荐使用静态内部类单例模式
public class Singleton{ private Singleton(){ } public static Singleton getInstance(){ return SingletonHolder.sintens; } private static class SingletonHolder{ private static final Singleton sintens = new Singleton(); } }