使用单例模式,是由于一个类的使用只需要创建一个对象,在项目运行的时候不需要过多的创建,过多的创建是很消耗资源的,例如mybatis连接数据库使用的sqlSessionFactory用户生产sqlSession的工程,创建一次就好,这就是单例
单例模式需要注意的关键:
1.将构造方法的修饰符设置为private
2.通过一个静态方法获取单例对象
3.确保单例类的对象有且只有一个,特别是在多线程的情况下
4.确保单例类对象在反序列化时不会重新构建对象
单例的实现模式
1.饿汉式:
public class SingleA {
private static SingleA instance = new SingleA();
//将构造函数私有化防止外界构造
private SingleA(){
}
public static SingleA getInstance(){
return instance;
}
}
2.懒汉式:
public class SingleB {
private static SingleB instance = null;
//将构造函数私有化防止外界构造
private SingleB(){
}
//获取SingletonB的唯一实例,用synchronized关键字保证某一时刻只有一个线程调用此方法。
public static synchronized SingleB getInstance(){
if(instance ==null){
instance = new SingleB();
}
return instance;
}
}
加上同步的方法保证了单例对象的唯一,只有使用时才会创建一定程度上节约了资源,但第一次使用时可能会慢,需要实例化嘛,还有在每次调用getInstance()方法时都需要同步,消耗了不必要的资源
3.DCL(Double CheckLock)单例化
public class SingleDcl {
private static SingleDcl instance = null;
//将构造函数私有化防止外界构造
private SingleDcl(){
}
public static SingleDcl getInstance(){
if(instance==null){
synchronized (SingleDcl.class){
if(instance==null){
instance = new SingleDcl();
}
}
}
return instance;
}
}
资源利用率高,只有使用时才会实例,又保证线程安全
4.静态内部类
public class SingleStatic {
//将构造函数私有化防止外界构造
private SingleStatic(){
}
public static SingleStatic getInstance(){
return SingleStaticBuilder.instance;
}
/**
* 静态内部类
*
*/
private static class SingleStaticBuilder {
private static SingleStatic instance = new SingleStatic();
}
}
这种方法第一次加载SingleStatic时不会被加载,只有在第一次调用方法时,虚拟机就会加载SingleStaticBuilder
初始化instance,这种方法既保证了线程安全,单例对象的唯一,也延迟了单例的初始化
5.简单的单例模式管理
public class SingleManager {
private static Map<String,Object> map = new HashMap<>();
//注入单例
public static void registerService(String key ,Object instance){
if (!map.containsKey(key)) {
map.put(key, instance);
}
}
//获取单例
public static Object getService(String key){
return map.get(key);
}
}
本文详细介绍了单例模式的概念及其在不同场景下的实现方式,包括饿汉式、懒汉式、双重检查锁定(DCL)及静态内部类等,并提供了一个简单的单例模式管理示例。
1276

被折叠的 条评论
为什么被折叠?



