什么是单例模式
Ensure a class has only one instance, and provide a global point of access to it.
确保一个类产生的实例只有一个,自行的创建这个实例化对象,并且向着整个系统中提供这个实例
什么地方需要单例模式
举例:
1、在操作系统中的回收站,创建出来一个回收站的实例即可,不需要重复的创建多个回收站
2、网站的访问计数器类,只需要一个实例即可,多个计数器反而容易造成线程安全的问题
3、需要频繁实例化,然后销毁的对象,考虑使用单例模式,节约内存;
4、创建出来的对象消耗的时间比较长,并且使用的比较多的时候,可以考虑使用单例模式;
5、对于数据库的连接对象,只是需要一个就可以;
6、创建出来的某个管理器,比如配置管理器以及错误管理器,只是需要创建出来一个实例即可,不需要创建多个实例;
怎么实现单例模式
单例模式的实现方式有很多,相对来说,在保证线程安全的情况下,使用 DCL 模式的实现是比较优秀的;
基于 DCL(Double Check Lock)模式
创建出来的单例模式是线程安全的;
所谓的线程安全就是保证了代码块执行的原子性、可见性、有序性;
public class Singleton {
private volatile static Singleton singleton; //1:volatile修饰
private Singleton (){}
public static Singleton getSingleton() {
if (singleton == null) { //2:减少不要同步,优化性能
synchronized (Singleton.class) { // 3:同步,线程安全
if (singleton == null) {
singleton = new Singleton(); //4:创建singleton 对象
}
return singleton;
}
}
基于静态内部类模式
基于静态内部类的单例模式的实现是线程安全的,同时可以看出,基于这种模式下面创建出来的单例实例是比较简洁的,代码是容易看懂的;
public class Singleton {
private Singleton(){
}
public static Singleton getSingleton(){
return Inner.instance;
}
private static class Inner {
private static final Singleton instance = new Singleton();
}
}
使用单例模式的优点以及缺点
优点:
1、节省了内存空间
2、避免了重复的创建对象,提高了性能
3、因为是单例,只有这一个访问入口,所以为整个系统提供了一个全局访问点;
缺点:
1、不适合使用在变化频繁的对象
2、不能滥用单例模式,因为创建出来的大量的单例模式,长时间这个对象没有被使用的话,这个对象是会被垃圾回收器回收的;
小结
本文介绍了什么是单例模式,介绍了单例模式的两种实现:DCL以及静态内部类的实现,两者都是线程安全的,比较了单例模式的优点以及缺点,得出结论:不可大量的滥用单例模式,是要适量的使用即可;