1、延迟加载:
在不使用这个对象的时候,坚决不创建这个对象
只有到了不得不创建的时候,才去创建
2、实现:
1、声明引用时,不创建对象
2、在获取对象的方法中创建对象
3、外层判断,用于提升效率,过滤大部分不为null的情况
4、内层判断,用于在同步代码块中确保引用确实为null
5. 代码实现
class MySingleton2 {
private MySingleton2() {
}
private static MySingleton2 m;
public static MySingleton2 getInstance() {
//如果某条线程判断m==null,并不能说明m确实就可以被赋值
if (m == null) {
synchronized (MySingleton2.class) {
if (m == null) {
m = new MySingleton2();
}
}
}
//如果,m==null判断为假,一定可以确定m已经被赋值了,可以直接返回
return m;
}
}
4. 老汉式(书面不存在)
1、属于饿汉式的一种
2、实现:
不定义方法了,直接将引用设定为公共的
加上final只能访问,不能修改
class MySingleton3 {
private MySingleton3() {
}
public static final MySingleton3 m = new MySingleton3();
}