单例的一些实现方式
2018-03-01 本文已影响144人
pphdsny
-
懒汉式 - 用到才去创建实例,得注意多线程同时创建
双重校验
public class SingletonClass{ private static volatile final SingletonClass sInstance; private SingletonClass(){} public static SingletonClass getInstance(){ if(sInstance == null){ synchronized(SingletonClass.class){ if(sInstance == null){ sInstance = new SingletonClass(); } } } return sInstance; } }
-
饿汉式 - 事先创建好对象
因为单例的实例被声明成 static 和 final 变量了,在第一次加载类到内存中时就会初始化,所以创建实例本身是线程安全的。
-
私有静态内部类实现(推荐)
内部类分为对象级别和类级别,类级内部类指的是,有static修饰的成员变量的内部类。如果没有static修饰的成员变量的内部类被称为对象级内部类。
类级内部类相当于其外部类的static成员,它的对象与外部类对象间不存在依赖关系,相互独立,因此可直接创建。而对象级内部类的实例,是必须绑定在外部对象实例上的。类级内部类只有在第一次被使用的时候才被会装载。
public class SingletonClass{ private static class SingletonHolder{ public static final SingletonClass sInstance = new SingletonClass(); } private SingletonClass(){} public static SingletonClass getInstance(){ return SingletonHolder.sInstance; } }