一、请说下设计模式中,你熟悉的设计模式
单例模式
二、单例模式你有了解吗
单例模式是创建型设计模式,该类负责创建自己的对象,他确保一个类只有一个实例,并且提拱了一个去全局访问点来访问该实例。
二、单例模式有几种实现方式
1.饿汉式(静态常量)
优点:写法容易,在类加载的时候就已经实例化了,避免了线程同步的问题
缺点:在类实例化的时候就完成实例化操作了,如果没有使用过这个实例,则会发生资源垃圾。
public class Singleton {
public final static Singleton instance = new Singleton();
private Singleton(){}
public Singleton getInstance(){
return instance;
}
}
2.饿汉式(静态代码块)
public class Singleton {
private static Singleton instance;
static {
instance = new Singleton();
}
private Singleton(){}
public Singleton getInstance(){
return instance;
}
}
3.懒汉式(多线程下,会有线程问题,不推荐)
public class Singleton {
private Singleton(){}
public static Singleton singleton;
public Singleton getInstance(){
if(singleton==null){
singleton = new Singleton();
}
return singleton;
}
}
4.饿汉式(在上面的基础上加锁),加static,是为了可以作用于类之上,对整个类都行
public class Singleton {
private Singleton(){}
public static Singleton singleton;
public static synchronized Singleton getInstance(){
if(singleton==null){
singleton = new Singleton();
}
return singleton;
}
}
5.饿汉锁(双检锁)使用volatile和synchronized,也是作用于整个类的锁
public class Singleton {
private static volatile Singleton instance;
private Singleton(){}
public Singleton getInstance(){
if(instance==null){
synchronized (Singleton.class){
instance = new Singleton();
}
}
return instance;
}
}
6.饿汉式(在使用的时候才会进行加载),静态内部类方式在Singleton类被装载时并不会立即实例化,而是在需要实例化时,调用getInstance方法,才会装载SingletonInstance类,从而完成Singleton的实例化。所以在这里,JVM帮助我们保证了线程的安全性,在类进行初始化时,别的线程是无法进入的。
优点:避免了线程不安全,延迟加载,效率高。
public class Singleton {
private Singleton(){}
private static class SingletonInstance{
private static final Singleton instance = new Singleton();
}
public static Singleton getInstance(){
return SingletonInstance.instance;
}
}
三、单例模式的使用场景
- 要频繁的进行创建和销毁的对象
- 创建对象时耗时过多或耗费资源过多,但又经常用到的对象;
- 工具类对象;
- 频繁访问数据库或文件的对象。
四、哪些源码使用了设计模式,体现在哪些地方?
4.1 Spring
Spring依赖注入Bean实例
4.2 Mybatis
标签:面试官,Singleton,private,instance,static,单例,singleton,设计模式,public From: https://blog.csdn.net/qq_62773260/article/details/136818480SqlSessionFactory (使用的是懒汉式)
ErrorContent