单例模式

单例的四大原则:

1.构造私有。
2.以静态方法或者枚举返回实例。
3.确保实例只有一个,尤其是多线程环境。
4.确保反序列化时不会重新构建对象。

单例的五种实现

一、饿汉式

    private static SingleTon INSTANCE = new SingleTon();

    private SingleTon() {
    }

    public static SingleTon getInstance() {
        return INSTANCE;
    }
}

优点:线程安全
缺点:浪费空间

二、懒汉式

public class SingleTon {
    private static SingleTon INSTANCE;

    private SingleTon() {
    }

    public static SingleTon getInstance() {
        if (INSTANCE == null) {
            INSTANCE = new SingleTon();
        }
        return INSTANCE;
    }
}

优点:延迟加载,节省空间
缺点:不是线程安全的

三、静态内部类

public class SingleTon {
    
    private SingleTon() {
    }

    public static SingleTon getInstance() {
        return SingleTonHolder.INSTANCE;
    }

    private static class SingleTonHolder {
        private static SingleTon INSTANCE = new SingleTon();
    }
}

优点:延迟加载,线程安全
缺点:不能传参

四、双重校验锁(Double Check Lock)

public class SingleTon {
    private static volatile SingleTon INSTANCE;

    private SingleTon() {
    }

    public static SingleTon getInstance() {
        if (INSTANCE == null) {
            synchronized (SingleTon.class) {
                if (INSTANCE == null) {
                    INSTANCE = new SingleTon();
                }
            }
        }
        return INSTANCE;
    }
}

优点:延迟加载,线程安全,可传参
缺点:volatile会稍微影响性能,在这里的作用是禁止指令重排序
Java volatile关键字最全总结:原理剖析与实例讲解(简单易懂)
volatile关键字在Android中到底有什么用?

五、枚举

enum SingleTon {
    INSTANCE;

    void method() {

    }
}

优点:线程安全,代码简单
缺点:不能传参,不能延时加载

结论:推荐第三种 DCL方式

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容