单例模式能够说是23中设计模式中应用最广的一种模式了。
java
定义:确保某一个类只有一个实例,自行实例化而且想整个系统提供这个实例。设计模式
使用场景:避免某个类产生多个对象而消耗过多的资源,确保某个类在程序中只有一个实例。好比咱们使用的图片加载器ImageLoader。每每单例建立的对象,耗费的资源都比较多,因此在初始化单例对象的时候就显得尤其重要了,接下来,咱们就来聊一聊单例的几种实现方式。多线程
1、饿汉式ide
[java] view plain copy性能
public class ImageLoader{ 优化
private static ImageLoader instance = new ImageLoader; url
private ImageLoader(){} spa
public static ImageLoader getInstance(){ .net
return instance; 线程
}
}
饿汉式顾名思义,就是这个汉子很饿,一上来就把单例对象建立出来了,要用的时候直接返回便可,这种能够说是单例模式中最简单的一种实现方式。可是问题也比较明显。单例在尚未使用到的时候,初始化就已经完成了。也就是说,若是程序从头到位都没用使用这个单例的话,单例的对象仍是会建立。这就形成了没必要要的资源浪费。因此不推荐这种实现方式。
2、懒汉式
[java] view plain copy
public class ImageLoader{
private static ImageLoader instance;
private ImageLoader(){}
public static synchronized ImageLoader getInstance(){
if(instance == null){
instance = new ImageLoader();
}
return instance;
}
}
饿汉式也顾名思义,就是这个汉子比较懒,一开始的时候什么也不作,知道要使用的时候采起建立实例的对象。看起来还不错,只有在使用实例的时候,咱们才回去建立对象。可是细心的同窗可能发现了,咱们在获取实例的方法上加了锁,避免多线程引起的建立多个单例的状况。多线程的问题是避免了,但也形成了总体性能的降低,每次使用单例对象,都须要锁判断,下降了总体性能。很明显,懒汉式也不是咱们所要追求的目标。
3、Double CheckLock实现单例
英文稍好点的东西,应该都看懂了,DCL也就是双重锁判断机制,直接上代码。
[java] view plain copy
public 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;
}
}
能够看到,在获取单例对象的时候,咱们先进行了两为空判断,而且在第二次判断前加了锁,这就让程序变得更加优秀,在使用的时候,只会前几回获取单例对象的时候会进行锁判断,一旦单例对象建立完成,锁的任务也就完成了,在懒汉式的基础上,提升了性能。DCL是使用最多的单例实现方式,可以在使用的时候才进行单例对象的初始化建立,而且可以在绝大多数状况下保证对象的惟一性的正确性。请注意,是绝大多数状况下,也就是说,这种模式也不能彻底保证单例的对象的完美实现,可是,就通常状况下,这种模式都能知足需求。俗话说,学无止境,接下来咱们就来看看单例模式的终极实现版本。
4、静态内部类实现模式
直接上代码
[java] view plain copy
public class ImageLoader{
private static class InnerInstance{
private static final ImageLoader instance = new ImageLoader();
}
private ImageLoader(){}
public static ImageLoader ImageLoader(){
return InnerInstance.instance;
}
}
能够发现这种方式,并未加锁,由于第一次加载ImageLoader类时,并不会实例化单例对象,只有第一次调用getInstance()方法时会致使虚拟机加载InnerInstance类,这种
方式不只能保证对象的单一性,还避免加锁带来的性能问题,又启动了延迟加载的优化,因此这就是单例模式的终极实现版本,也是推荐使用的方式。