单例,就是整个程序有且仅有一个实例.该类负责创建自己的对象,同时确保只有一个对象被创建,常用于工具类的实现和创建对象需要消耗资源
- 将构造函数访问修饰符设置为private
- 通过一个静态方法或者枚举返回单例类对象
- 确保单例类的对象有且只有一个,特别是在多线程环境下
- 确保单例类对象在反序列化时不会重新构建对象
- 饿汉式
- 懒汉式
- 双重校验锁
- 静态内部类
- 枚举
- 容器
当程序启动或类被加载的时候,实例就就被创建。
public class SingleBean{
//构造私有
private SingleBean(){}
private static SingleBean singleBean=new SingleBean();
public static SingleBean getInstance(){
return singleBean;
}
}
2、懒汉式
优点:单例对象在需要时,才会去构造
缺点:线程不安全的,多个线程调用,会产生多个单例对象
public class SingleBean{
//构造私有
private SingleBean(){}
private static SingleBean singleBean=null;
public static SingleBean getInstance(){
if(null==singleton){
singleBean=new Singleton();
}
return singleBean;
}
3、双重校验锁
优点:可以解决线程安全问题,效率高
public class SingleBean{
//构造私有
private SingleBean(){}
private static volatile SingleBean singleBean=null;
public static SingleBean getInstance(){
if (singleBean == null) {
synchronized (Singleton.class) {
if (singleBean == null) {
singleBean = new Singleton();
}
}
}
return singleBean;
}
}
1.第一个判断,避免不要的实例。解决多线程情况下,不为空,直接返回,不需要再判断同步锁,提高性能
2.第二个判断,避免同步。在多线程情况下,一条线程a在执行new对象操作,其他线程在锁外等待,不加判断的话,则线程a执行完new之后,会产出多个单例对象
优点:实现简单,懒加载,线程安全
缺点:增加一个静态内部类,apk文件增大
public class SingletonTest {
private SingletonTest() {}
private static class SingletonHolder{
private static final SingletonTest instance = new SingletonTest();
}
public static SingletonTest getUniqueInstance() {
return SingletonHolder.instance;
}
}
5、枚举
优点:使用枚举是线程安全的,不用担心序列化和反射问题
缺点:枚举占用内存多一点,但枚举实例在日常开发是很少使用的,就是很简单以导致可读性较差。
public enum EnumSingleton{
SINGLEBEAN;
//doSomething 该实例支持的行为
//可以省略此方法,通过Singleton.SINGLEBEAN进行操作
public static Singleton getInstance() {
return Singleton.SINGLEBEAN;
}
}
6、容器
优点:通过统一的接口获取操作,隐藏了具体实现,降低了耦合度。
public class SingletonManager {
private static Map objMap = new HashMap();
public static void regsiterService(String key, Object instance) {
if (!objMap.containsKey(key)) {
objMap.put(key, instance);
}
}
public static Object getService(String key) {
return objMap.get(key);
}
}



