核心作用:保证一个类只有一个实例,并且提供一个访问该实例的全局访问点,减少了系统性能开销。
常见应用场景:Windows的任务管理器就是很典型的单例模式;数据库连接池的设计一般也是采用单例模式…
常见的五种单例模式实现方式:
1.饿汉式:线程安全,调用效率高。 但是,不能延时加载;
2.懒汉式:线程安全,调用效率不高,可以延时加载;
3.静态内部类式:线程安全,调用效率高,可以延时加载;
4.枚举式:线程安全,调用效率高,不能延时加载。并且可以天然的防止反射和反序列化创建对象的漏洞!
5.双重检测锁式:JVM底层内部模型原因,偶尔会出问题。不建议使用;
饿汉式:
1 | //饿汉式: |
懒汉式:
1 | //懒汉式: |
静态内部类式:
1 | //静态内部类方式:线程安全,调用效率高,实现延时加载 |
枚举式:
1 | //枚举类方式:线程安全,但没有延时加载;同时能够避免反射和反序列的漏洞 |
如何选用合适的单例模式:
单例对象占用资源少,不需要延时加载:枚举式 > 饿汉式;
单例对象占用资源大,需要 延时加载:静态内部类式 > 懒汉式;