单例模式
单例模式确保一个类只有一个实例,并提供一个全局访问点
优点
- 在内存中只有一个实例,减少了内存的开销,尤其是频繁的创建和销毁实例
- 避免对资源的多重占用
单例模式的几种实现
饿汉式
类加载时就把对象创建出来,用的时候直接返回。但是存在一个问题,就是单例还没有被使用就已经创建了,如果程序一直没有使用这个单例的话,就造成了不必要的资源浪费1
2
3
4
5
6
7
8public class ImageLoader{
private static ImageLoader instance = new ImageLoader();
private ImageLoader(){}
public static ImageLoader getInstance(){
return instance;
}
}
懒汉式+双重判断
一开始什么都不做,只有在使用的时候才创建实例对象。为了避免锁带来的性能问题,使用了双重判断1
2
3
4
5
6
7
8
9
10
11
12
13
14public class ImageLoader{
private static ImageLoader instance;
private ImageLoader(){}
public static ImageLoader getInstance(){
if(instance == null){
synchronized (ImageLoader.class){
if(instance == null){
instance = new ImageLoader();
}
}
}
return instance;
}
}
静态内部类实现
并未加锁,因为第一次加载ImageLoader类时,并不会实例化单例对象,只有第一次调用getInstance()方法时会导致虚拟机加载InnerInstance类,这种方式不仅能保证对象的单一性,还避免加锁带来的性能问题,又启动了延迟加载的优化,所以推荐使用这种方式。
1 | public class ImageLoader{ |