文章目录
一、单例模式概述
单例模式(Singleton Pattern)是一种常用的软件设计模式,它的主要目的是确保一个类只有一个实例,并提供一个全局访问点来访问这个实例。这种模式可以避免多个实例的产生,有助于节省系统资源,并保证在整个应用中该类的方法和状态的一致性。
二、单例模式特点
- 私有构造函数:为了防止其他对象实例化该类,单例类的构造函数通常被声明为私有的。
- 静态内部实例:单例类内部包含一个
静态的成员变量
,用于存储唯一实例。 - 公共获取方法:单例类提供一个静态方法来安全地返回实例。这个方法通常会处理
线程安全
和延迟初始化
等问题。 - 线程安全性:在多线程环境下,需要确保单例模式是线程安全的,即无论多少线程同时访问,都只能创建一个实例。
- 延时初始化:就是这个单例对象什么时候被初始化,提前初始化(饿汉式),第一次被调用时初始化(懒汉式)。
三、示例
3.1、基本实现(懒汉式-线程不安全)
java
public class Singleton {
private static Singleton instance;
// 私有构造函数
private Singleton() {}
// 公共静态方法,线程不安全
public static Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
3.2、基本实现(懒汉式-线程安全)
java
public class Singleton {
private volatile static Singleton instance;
private Singleton() {}
// 双重检查锁定
public static Singleton getInstance() {
// 第一次:判空
if (instance == null) {
// 第二次:创建时加锁,保证线程安全
synchronized (Singleton.class) {
if (instance == null) {
instance = new Singleton();
}
}
}
return instance;
}
}
3.3、基本实现(饿汉式)
java
public class Singleton {
// 构建的时候就初始化
private static Singleton instance = new Singleton();
private Singleton() {}
public static Singleton getInstance() {
return instance;
}
}
四、总结
单例模式在实际开发中非常常见,尤其是在管理配置文件、日志对象、数据库连接等方面。不过需要注意的是,单例模式也有其局限性,比如过度使用会导致代码变得难以测试和维护。因此,在使用时需要权衡利弊。