没有使用单例模式之前
使用单例模式后
优点
单例设计模式有八种
弊端:
如果把person换成dbaccess这个工具类,我们可以发现整个项目会创建出多个工具类实例,浪费空间。
实际上:
整个项目,我们只需要一个工具类实例,就可以维持项目的正常运作,那么此时让该工具类实现单例,解决资源浪费的情况。
案例代码
运行显示
如下图和案例的结果,可以得出结论:
整个项目使用到工具类,只需要实例化一次就可以保障整个项目的运转,节约了堆内存的空间
分类:
饿汉式(静态常量)
饿汉式(静态代码块)
懒汉式(线程不安全)
懒汉式(线程安全,同步代码块)
懒汉式(线程安全,同步方法)
双重检查
静态内部类
枚举
1.饿汉式(静态常量)
2.饿汉式(静态代码块)
** 3.懒汉式(线程不安全)**
4. 懒汉式(线程安全,同步代码块)
5.懒汉式(线程安全,同步方法)
6.双重检查
7.静态内部类
8.枚举
client类就不能直接person p = new person();
避免了写多个实例的创建,保证了空间不会被浪费
结论:
单例中两种饿汉式可用,但存在性能问题
单例中三种饿汉式不推荐,存在线程安全问题,同步方法的方式解决性能极差
最后三种单例式值得推荐(双重检查、静态内部类、枚举)
注意事项
系统内存中该类只存在一个对象,节省了系统资源,对于一些需要频繁创建销毁的对象使用单例模式可以提升系统性能
当想实例化一个单例类的时候,必须要记住使用相应的获取对象的方法,而不是使用new
应用
jdk源码中runtime类
tomcat中applicationcontext类
session工厂
建议单例使用饿汉式,代码更加简洁