1、何为设计模式?
设计模式:是一套被反复使用,多数人知晓,经过分类编码目的,代码设计经验的总结。
目的:使用设计模式是为了提高代码重用性,让代码更容易让人理解,并保证代码的可靠性。
2、何为单利模式
单利模式:顾名思义就是只能有一个实例,不能再出现第二个,就如同地球上没有两片一模一样的树叶一样。在此处即,一个类只能有一个实力,且整个项目都能访问该实例。
两大类:
- 饿汉模式:实例在类装载时创建
- 懒汉模式:实例在第一次使用时创建
饿汉模式:
public class Singleton{
private static Singleton instance = new Singleton();
private Singleton(){ }
public static Singleton getInstance(){
return instance;
}
}
由于instance的初始化是在类加载时进行的,类加载是由ClassLoader来实现的,如果初始化太早,就会造成资源浪费。当然,如果所需的单利占用的资源很少,并且也不依赖其他数据,那么这种实现方式也是很好的。
懒汉模式:
public class Singleton(){
private static volatile Singleton instance;
private Singleton(){ }
public static Singleton getInstance(){
if(instance == null){
synchronized(Singleton.class){
if(instance == null){
instance = new Singleton();
}
}
}
return instance;
}
}
上述代码中使用双重检查,并给instance的声明加上volatile关键字。
第一个if(instance == null),其实是为了解决一进入代码就加锁所出现的效率问题,只有instance为null 的时候,才进入synchronized 的代码大大减少了几率;
第二个if(instance == null),则是为了防止可能出现多个实例的情况。
另外,为什么要给instance的声明加上volatile关键字,是为了防止指令的重排序。
关于原子操作、指令重排、volatile、synchronized的概念请参照另一篇