为什么使用单例模式?
单例模式是指在整个程序运行期间,保证某个类只有一个实例化对象,因此构造方法肯定是私有的,因为外部是无法new出来对象的,所以获取类的方法必须是静态的。
常见的引用场景包括:
- 程序配置类,使用程序在启动的时候只需要配置一次。也可以理解成程序在启动的时候需要加载的一些东西,一些准备工作。
- 连接池、线程池等对象。一个应用程序应该只有一个
这里粗滤提一个概念,类的运行流程:
- (类加载)将类的信息加载到内存中,并为每种数据类型划分内存空间
➡ - (实例化)将内存中为类的属性设置初始值,即各个数据类型的初始值(int为0,boolean 为false,String默认值为null,对象默认值为null)
➡ - (初始化)为类的属性附上我们传入的值(比如说有参构造,这里才是真正我们给定的值),静态代码块或者静态变量是在初始化阶段才被赋值或者执行!
static存在的意义个人理解。
如果说static是为了在初始化前进行赋值或者执行一段代码逻辑,为什么不在构造函数中直接赋值或执行逻辑呢?考虑到构造方法重载,减少代码重复,这样设计也是有必要的。欢迎大佬补充
单例模式的写法
- 懒汉式
//在类初始化之后model对象为空对象,在调用getModel方法的时候才进行实例化
public class SingletonModel {
private static SingletonModel model;
private SingletonModel(){
}
public static SingletonModel getModel(){
if (model==null){
model= new SingletonModel();
}
return model;
}
}
- 饿汉式
//在初始化时就已经new了一个对象了(饿汉,比较急),对象的获取通过getModel方法获得
public class SingletonModel {
private static SingletonModel model=new SingletonModel();
private SingletonModel(){
}
public static SingletonModel getModel(){
return model;
}
}
- 双锁机制的单例模式
public class SingletonModel {
private static SingletonModel model;
private SingletonModel(){
}
public static SingletonModel getModel(){
if (model==null){
synchronized (SingletonModel.class){
if (model==null){ //当model 为空时候,可能会出来多个线程在同步锁处等待,当第一个线程进来创建成功后,model已经不为空,但是第二个线程是等待在同步锁前的,它的判断条件
//依然是model为空,所以需要进行第二次判断
model=new SingletonModel();
}
}
}
return model;
}
}
有不对的地方请各位大佬指正。