一个单一的类,负责创建自己的对象,同时确保系统中只有单个对象被创建。
单例特点
应用场景
什么场景用到?
- 多线程中的线程池
- 数据库的连接池
- 系统环境信息 上下文(ServletContext) ……
面试问题
- 系统环境信息(System.getProperties())?
- Spring中怎么保持组件单例的?
- ServletContext是什么(封装Servlet的信息)?是单例吗?怎么保证?
- ApplicationContext是什么?是单例吗?怎么保证?
- ApplicationContext: tomcat:一个应用(部署的一个war包)会有一个应用上下文
- ApplicationContext: Spring:表示整个IOC容器(怎么保证单例的)。
- ioc容器中有很多组件(怎么保证单例)
- 数据库连接池一般怎么创建出来的,怎么保证单实例? …… 、
代码实现
@Data
public class Singleton {
private String name;
private String age;
//volatile修饰 禁止指令重排序 保证内存可见性
private static volatile Singleton singleton /*=new Singleton()*/;//饿汉式 加载类对象即创建
/*构造方法私有化*/
private Singleton(){
}
/*静态方法对外暴露获取单例方法*/
public static Singleton getSingleton(){
//双重加锁校验保证效率和线程安全 此处线程无需强锁等待直接返回
if(singleton == null){
synchronized (Singleton.class){
if(singleton == null){
singleton = new Singleton();
}
}
}
return singleton;
}
}