设计模式-单例模式
一、双重检查(推荐)
/**
* 右手类,正常来说你的右手只有一个吧,不可能有多个右手。
* 所以,右手类必须定义为单例模式
* 单例模式:双重检查(推荐),在懒汉式的基础上增加了延迟初始化和线程安全的判断,降低了同步的开销。
*/
public class RightHand {
// 使用volatile关键字保证多线程环境下的可见性
private static volatile RightHand instance;
//将构造方法设为私有,防止外部创建实例
private RightHand() {}
//提供一个全局访问点
public static RightHand getInstance() {
//第一次检查实例是否已经创建
if(instance == null){
//线程安全的创建实例
synchronized (RightHand.class){
// 第二次检查实例是否已经创建
if(instance == null){
instance = new RightHand();
}
}
}
return instance;
}
}
二、静态内部类(推荐)
/**
* 左手类,正常来说你的左手只有一个吧,不可能有多个左手。
* 所以,左手类必须定义为单例模式
* 单例模式:静态内部类(推荐),利用了Java的内部类特性,实现了懒加载,同时保证了线程安全。
*/
public class LeftHand {
//将构造方法设为私有,防止外部创建实例
private LeftHand(){}
//提供一个全局访问点
public static LeftHand getInstance(){
// 使用同步代码块保证线程安全
synchronized (LeftHand.class){
// 判断实例是否已经创建,如果已经创建则直接返回
if(LeftHandHolder.INSTANCE!=null){
return LeftHandHolder.INSTANCE;
}else{
// 如果实例未创建,则创建一个新的实例并返回
LeftHand newInstance = new LeftHand();
// 将新创建的实例赋值给静态内部类的引用
LeftHandHolder.INSTANCE = newInstance;
return newInstance;
}
}
}
// 创建一个静态内部类,用于持有外部类的实例
private static class LeftHandHolder{
private static LeftHand INSTANCE = new LeftHand();
}
}
三、使用场景
单例模式是一种常用的软件设计模式,它保证一个类只有一个实例,并提供一个全局访问点。以下是一些常见的使用场景:
-
配置管理:在应用程序中需要对一些配置项进行统一管理和修改时,可以使用单例模式来保证只有一个配置管理器实例。
-
日志管理:在应用程序中需要记录日志时,可以使用单例模式来保证只有一个日志管理器实例,从而方便地集中管理和输出日志。
-
数据库连接池:在应用程序中需要频繁地创建和销毁数据库连接时,可以使用单例模式来保证只有一个数据库连接池实例,从而提高性能和资源利用率。
-
缓存管理:在应用程序中需要对一些数据进行缓存时,可以使用单例模式来保证只有一个缓存管理器实例,从而提高缓存的读写效率。
-
线程池管理:在应用程序中需要对线程进行统一管理和调度时,可以使用单例模式来保证只有一个线程池实例,从而方便地管理和控制线程的执行。