五种单例模式的Java实现

转自:https://blog.csdn.net/u011386173/article/details/82454714

1.饿汉式

(1)饿汉式

  提前(类加载时)创建

  • 优点:确保单例;
  • 缺点:单例永远不用时浪费内存
  • 常见方式
public class Singleton {
    private static Singleton instance=new Singleton();
    private Singleton(){}//非私有构造器无法保证单例
    public static Singleton getInstance(){
        return instance;
    }
}

(2)饿汉式变体

public class Singleton {
    private static Singleton instance=null;
    static {
        instance=new Singleton();
    }
    private Singleton(){}//非私有构造器无法保证单例
    public static Singleton getInstance(){
        return instance;
    }
}

2.懒汉式

(1)懒汉式(非线程安全)

  • 优点:需要时创建;
  • 缺点:多线程时并发调用getInstance,可能创建多个实例;
  • 不推荐
public class Singleton {
    private static Singleton instance=null;
    private Singleton(){}//非私有构造器无法保证单例
    public static Singleton getInstance(){
        if(instance==null) {
            instance=new Singleton();
        }
        return instance;
    }
}

(2)懒汉式(线程安全)

  • 优点:需要时创建;
  • 缺点:多线程时需要等待,效率低
  • 不推荐
public class Singleton {
    private static Singleton instance=null;
    private Singleton(){}//非私有构造器无法保证单例
    public static synchronized Singleton getInstance(){
        if(instance==null) {
            instance=new Singleton();
        }
        return instance;
    }
}

3.静态内部类

类似于饿汉式

public class Singleton {

    private Singleton(){}//非私有构造器无法保证单例
    private static class SingletonHolder {
        private static Singleton instance=new Singleton();
    }
    public static  Singleton getInstance(){
        return SingletonHolder.instance;
    }
}

4.双重检查加锁

属于懒汉式

  • 优点:线程安全,保证单例,效率高;需要时创建;
  • 推荐使用
public class Singleton {
    private volatile static Singleton instance;//volatile作用禁止指令重排
    private Singleton(){}
    public static Singleton getInstance(){
        if(instance==null){//只有第一会同步,保证效率
            synchronized (Singleton.class){//同步锁
                if(instance==null){//保证单例
                    instance=new Singleton();
                }
            }
        }
        return instance;
    }
}

5.枚举

  • 优点:代码简单,支持序列化
  • 缺点:不能需要时创建(懒加载)
public enum Singleton {
    INSTANCE;
    public void whateverMethod(){
    }
}

最后借用 《Effective Java》一书中的话:

单元素的枚举类型已经成为实现Singleton的最佳方法.

单例模式在Android使用场景:
xxxManager , xxxHelper , xxxUtils

猜你喜欢

转载自blog.csdn.net/DavidHuang2017/article/details/88859523