单例模式简介
单例模式(Singleton Pattern)是一种设计模式,确保一个类只有一个实例,并提供一个全局访问点来获取这个实例。它广泛应用于系统配置管理、数据库连接管理、线程池管理等领域。掌握单例模式对于开发者来说具有重要意义,不仅可以提高代码质量,还能优化系统性能。
单例模式的实现方式
1. 饿汉式单例
饿汉式单例是指在类加载时就立即创建一个对象实例。这种方式的实现简单,但不利于性能优化。
public class Singleton {
private static final Singleton INSTANCE = new Singleton();
private Singleton() {
}
public static Singleton getInstance() {
return INSTANCE;
}
}
2. 懒汉式单例
懒汉式单例是指在第一次调用getInstance()方法时才创建对象实例。这种方式相对于饿汉式来说,更注重性能优化。
public 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;
}
}
3. 双重校验锁单例
双重校验锁单例结合了懒汉式和同步代码块的优点,确保单例的创建过程线程安全,且不会影响性能。
public 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;
}
}
4. 静态内部类单例
静态内部类单例通过将实例封装在静态内部类中,保证了单例的创建过程线程安全。
public class Singleton {
private Singleton() {
}
private static class InnerClass {
private static final Singleton INSTANCE = new Singleton();
}
public static Singleton getInstance() {
return InnerClass.INSTANCE;
}
}
5. 枚举单例
枚举单例将实例定义在枚举中,确保单例的线程安全性和序列化问题。
public enum Singleton {
INSTANCE;
public void doSomething() {
// do something
}
}
单例模式的应用场景
- 系统配置管理:如数据库连接池、文件读取器等。
- 工具类:如日志记录器、缓存管理等。
- 服务类:如用户认证、权限检查等。
- 数据库访问层:如数据源连接池、SQL语句预处理等。
单例模式案例分析
以下以数据库连接池为例,演示单例模式的应用。
public class DataSource {
private static volatile DataSource INSTANCE = null;
private DataSource() {
}
public static DataSource getInstance() {
if (INSTANCE == null) {
synchronized (DataSource.class) {
if (INSTANCE == null) {
INSTANCE = new DataSource();
}
}
}
return INSTANCE;
}
public Connection getConnection() throws SQLException {
// 模拟数据库连接过程
return DriverManager.getConnection("jdbc:mysql://localhost:3306/test", "root", "password");
}
}
总结
通过以上对单例模式的介绍,相信你已经掌握了单例模式的实现方式和应用场景。在实际开发过程中,要根据具体情况选择合适的实现方式,以实现高性能、高并发的系统设计。希望本文对你有所帮助!
