单例模式概述单例模式(Singleton Pattern)是设计模式中的一种创建型模式,其核心思想是确保一个类只有一个实例,并提供一个全局访问点来获取这个实例。在Java中,单例模式广泛应用于资源管理...
单例模式(Singleton Pattern)是设计模式中的一种创建型模式,其核心思想是确保一个类只有一个实例,并提供一个全局访问点来获取这个实例。在Java中,单例模式广泛应用于资源管理、全局配置、日志管理等场景。
原理:饿汉式在类加载时就完成了实例的初始化,在类加载时就完成了实例化,保证了线程安全,但这种方式会提前占用内存。
代码示例:
public class EagerSingleton { private static final EagerSingleton instance = new EagerSingleton(); private EagerSingleton() {} public static EagerSingleton getInstance() { return instance; }
}优缺点:
原理:懒汉式在第一次使用时才创建实例,避免了内存浪费,但线程不安全,需要添加同步控制。
代码示例:
public class LazySingleton { private static LazySingleton instance; private LazySingleton() {} public static synchronized LazySingleton getInstance() { if (instance == null) { instance = new LazySingleton(); } return instance; }
}优缺点:
原理:双重检查锁定结合了懒汉式和同步控制的优势,确保线程安全,同时减少同步控制的开销。
代码示例:
public class DoubleCheckedLockingSingleton { private static volatile DoubleCheckedLockingSingleton instance; private DoubleCheckedLockingSingleton() {} public static DoubleCheckedLockingSingleton getInstance() { if (instance == null) { synchronized (DoubleCheckedLockingSingleton.class) { if (instance == null) { instance = new DoubleCheckedLockingSingleton(); } } } return instance; }
}优缺点:
原理:静态内部类在类加载时不会立即加载,只有当使用getInstance()方法时才会加载,同时保证了线程安全。
代码示例:
public class StaticInnerClassSingleton { private static class SingletonHolder { private static final StaticInnerClassSingleton INSTANCE = new StaticInnerClassSingleton(); } private StaticInnerClassSingleton() {} public static final StaticInnerClassSingleton getInstance() { return SingletonHolder.INSTANCE; }
}优缺点:
以下是一个使用单例模式实现数据库连接池的案例:
public class DatabaseConnectionPool { private static final int MAX_CONNECTIONS = 10; private static int currentConnections = 0; private static List connections = new ArrayList<>(); private static DatabaseConnectionPool instance; private DatabaseConnectionPool() { if (currentConnections < MAX_CONNECTIONS) { Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/database", "username", "password"); connections.add(connection); currentConnections++; } } public static synchronized DatabaseConnectionPool getInstance() { if (instance == null) { instance = new DatabaseConnectionPool(); } return instance; } public Connection getConnection() { if (connections.isEmpty()) { return null; } return connections.remove(0); } public void releaseConnection(Connection connection) { connections.add(connection); }
} 在这个案例中,我们使用懒汉式单例模式来创建数据库连接池,确保整个应用程序中只有一个数据库连接池实例。
Java单例模式有四种经典实现方式,每种实现方式都有其优缺点。在实际开发中,应根据具体场景选择合适的单例模式实现方式。