设计模式面试题, 单例模式有哪几种实现?如何保证线程安全?
设计模式面试题, 单例模式有哪几种实现?如何保证线程安全?
QA
Step 1
Q:: 单例模式是什么?
A:: 单例模式是一种设计模式,其目的是确保某一个类在整个应用程序生命周期中仅有一个实例,并提供一个全局访问点。单例模式确保一个类只有一个实例,并且自行实例化并向整个系统提供这个实例。
Step 2
Q:: 单例模式有哪几种实现方式?
A:: 单例模式主要有以下几种实现方式:
1.
饿汉式(Eager Initialization):在类加载时就创建实例,线程安全但可能造成资源浪费。
2.
懒汉式(Lazy Initialization):在需要的时候才创建实例,存在多线程问题。
3. 双重检查锁定(Double-
Check Locking):在懒汉式的基础上通过双重检查和同步锁解决线程安全问题。
4.
静态内部类(Static Inner Class):利用类加载机制实现线程安全和延迟加载。
5.
枚举(Enum):利用枚举天然的线程安全和唯一性实现单例。
Step 3
Q:: 如何保证单例模式的线程安全?
A:: 在实现单例模式时,可以通过以下方式保证线程安全:
1.
使用synchronized关键字进行同步,确保只有一个线程可以访问创建实例的代码块。
2.
使用双重检查锁定,减少同步开销。
3.
使用静态内部类方式,利用JVM的类加载机制实现线程安全。
4.
使用枚举单例,枚举类的实例创建是线程安全的,并且天然防止反射攻击和序列化攻击。
Step 4
Q:: 单例模式在实际生产中有哪些应用场景?
A:: 单例模式在生产环境中常用于以下场景:
1.
配置管理类:全局唯一的配置管理器,方便应用程序获取统一的配置信息。
2.
日志管理类:系统日志记录器通常需要全局唯一,避免多实例导致日志混乱。
3.
数据库连接池:管理数据库连接的池化工具需要全局唯一,防止资源浪费和冲突。
4.
缓存管理类:全局缓存工具类,通过单例模式实现全局访问和管理。