java中的单例设计模式是一种常用的设计模式,它用于确保一个类中只有一个实例,并提供一个全局访问点来获取这个实例。单例模式有两个实现方法:懒汉式和饿汉式。
一、懒汉式
懒汉式单例设计模式是指在全局的单例实例在第一次被使用时构建。
public class Single {
// 目标:在一个类的外部有且只有一个该类对象
// 私有构造函数,防止外部通过new创建实例
private Single(){}
// 私有静态变量,暂不实例化,延迟加载
private static Single single = new Single;
// 提供一个公共的静态方法,返回唯一实例,需要时创建
public static Single getInstance(){
if (single == null){
single = new Single();
}
return single;
}
}
懒汉式是线程不安全的,如果多个线程同时访问getInstance(),可能会创建多个实例。可以通过添加synchronized关键字到getInstance()方法来解决,但这样会降低效率。
public class Single {
// 私有构造函数,防止外部通过new创建实例
private Single(){}
// 私有静态变量,暂不实例化,延迟加载
private static Single single = new Single;
// 提供一个公共的静态方法,返回唯一实例,需要时创建
public static synchronized Single getInstance(){
if (single == null){
single = new Single();
}
return single;
}
}
二、饿汉式
饿汉式单例设计模式是指在类加载时就完成了初始化,所以类加载较慢,但获取对象的速度快。
public class Singlen {
//饿汉式
// 饿汉式单例实现
// 在类加载时就完成了Singlen实例的初始化,保证了单例的唯一性
// 同时,由于是在类加载时初始化,因此它也是线程安全的
private static Singlen singlen = new Singlen();
// 私有构造函数,防止外部通过new关键字直接创建Singlen类的实例
// 这是实现单例模式的关键步骤之一
private Singlen(){}
// 提供一个公共的静态方法,用于获取Singlen类的唯一实例
// 由于实例在类加载时就已经创建,所以这个方法总是返回相同的实例
public static Singlen getSinglen(){
return singlen;
}
}
饿汉式是线程安全的,因为实例在类加载时就已经创建,所以不存在多个线程同时访问getInstance()方法的问题。
懒汉式 | 饿汉式 | ||
效率 | 低 | 高 | 懒汉式每次都需要进行判断,而饿汉式不需要, 所以,相比而言懒汉式效率低,饿汉式效率高。 |
内存 | 少 | 多 | 饿汉式在类加载的时候就会直接创建对象,所以 就会直接占用内存,而此时并不一定会使用该对象 |