简单来说,就是一个类只能有一个实例,并且在项目中都能访问这个实例。
- 懒汉模式:实例在第一次使用时就创建
- 饿汉模式:实例在类装载时才被创建
- ‘ 饿汉模式 ’ 的代码如下
class Singleton {
private static Singleton instance = new Singleton();
private Singleton(){}
public static Singleton getInstance() {
return instance;
}
}
- ‘ 懒汉模式 ’ 的代码如下
class Singleton {
private static volatile Singleton instance = null;
private Singleton(){}
public static Singleton getInstance() {
if(instance == null){
synchronized (Singleton.class) {
if(instance == null)
instance = new Singleton();
}
}
return instance;
}
}
-
这种方法每次在获取instance之前先进行判断,如果instance为空的话,就new一个出来,否则就返回之前已存在的instance。
-
该方法虽然有些复杂,其中有两次的 if(instance == null) 判断,第一个解决了多线程时等待的效率问题,第二个则防止可能出现多个实例的情况,而volatile关键字起的作用则是禁止指令重排,这样对它的写操作就会有一个内存屏障,这样,在他的赋值完成之前,不会调用读操作。