首页
找靠谱产品
找解决方案
找靠谱公司
找案例
找对的人
专家智库
悬赏任务
SAAS
ToB门户
了解全球最新的ToB事件
论坛
潜水/灌水快乐,沉淀知识,认识更多同行。
ToB圈子
加入IT圈,遇到更多同好之人。
微博
Follow
记录
Doing
博客
Blog
文库
业界最专业的IT文库,上传资料也可以赚钱
下载
分享
Share
排行榜
Ranklist
相册
Album
应用中心
qidao123.com技术社区-IT企服评测·应用市场
»
论坛
›
数据库
›
SQL-Server
›
40岁开始学Java:Java中单例模式(Singleton Pattern), ...
返回列表
发新帖
40岁开始学Java:Java中单例模式(Singleton Pattern),实用场景有哪些?
[复制链接]
发表于 2025-10-22 19:10:54
|
显示全部楼层
|
阅读模式
在Java中,单例模式(Singleton Pattern)用于确保一个类只有一个实例,并提供全局访问点。以下是详细的实现方式、实用场景及留意事项:
一、单例模式的实现方式
1.
饿汉式(Eager Initialization)
特点
:类加载时立即创建实例,线程
安全
但大概浪费资源。
public class EagerSingleton {
private static final EagerSingleton instance = new EagerSingleton();
private EagerSingleton() {}
public static EagerSingleton getInstance() {
return instance;
}
}
复制
代码
长处
:实现简朴,线程
安全
。
缺点
:实例在类加载时创建,纵然未被利用。
2.
懒汉式(Lazy Initialization)
特点
:耽误实例化,但需处置惩罚线程
安全
题目。
public class LazySingleton {
private static LazySingleton instance;
private LazySingleton() {}
public static synchronized LazySingleton getInstance() {
if (instance == null) {
instance = new LazySingleton();
}
return instance;
}
}
复制
代码
长处
:按需创建实例。
缺点
:同步方法导致
性能
降落。
3.
双重查抄锁(Double-Checked Locking)
特点
:镌汰同步开销,需利用volatile防止指令重排。
public class DCLSingleton {
private static volatile DCLSingleton instance;
private DCLSingleton() {}
public static DCLSingleton getInstance() {
if (instance == null) {
synchronized (DCLSingleton.class) {
if (instance == null) {
instance = new DCLSingleton();
}
}
}
return instance;
}
}
复制
代码
长处
:分身线程安全和
性能
。
缺点
:实现较复杂,需留意JDK
版本
兼容性。
4.
静态内部类(Static Inner Class)
特点
:利用类加载机制包管线程安全。
public class InnerClassSingleton {
private InnerClassSingleton() {}
private static class Holder {
static final InnerClassSingleton instance = new InnerClassSingleton();
}
public static InnerClassSingleton getInstance() {
return Holder.instance;
}
}
复制代码
长处
:耽误加载,线程安全,无需同步。
缺点
:无法通过参数初始化实例。
5.
摆列单例(Enum Singleton)
特点
:由JVM包管唯一性,防止反射和序列化粉碎。
public enum EnumSingleton {
INSTANCE;
public void doSomething() {
// 方法实现
}
}
复制代码
长处
:天然线程安全,防反射和序列化攻击。
缺点
:无法继续其他类,不敷机动。
二、单例模式的利用场景
全局设置管理
比方,体系设置类必要全局唯一实例,确保设置划一。
日记记录器
同一管理日记输出,克制多个实例导致资源竞争。
数据库
毗连池
维护唯一的毗连池实例,高效管理
数据库
毗连。
缓存体系
缓存数据必要全局访问,克制重复创建缓存实例。
硬件资源访问
如打印机服务,需同一调治硬件资源。
三、留意事项与埋伏题目
线程安全
懒汉式需通过同步或双重查抄锁确保线程安全。
反射攻击
平凡单例大概被反射调用构造函数,需在构造器中添加防护:
private Singleton() {
if (instance != null) {
throw new IllegalStateException("Instance already exists");
}
}
复制代码
序列化与反序列化
实现Serializable接口时,需重写readResolve方法:
protected Object readResolve() {
return getInstance();
}
复制代码
测试困难
单例的全局状态大概导致测试耦合,可通过依靠注入(如Spring
容器
管理)解耦。
太过利用
滥用单例会进步代码耦合度,应仅在必要严酷唯一实例时利用。
四、总结
实现方式
线程安全
耽误加载
防反射
防序列化
实用场景
饿汉式✅❌❌❌简朴场景,实例轻量懒汉式(同步)✅✅❌❌必要耽误加载,
性能
不敏感双重查抄锁✅✅❌❌高性能要求的耽误加载静态内部类✅✅❌❌保举的耽误加载方式摆列✅❌✅✅高安全性要求(保举方式)
最佳实践
:
优先选择
摆列单例
或
静态内部类
实现。
克制通过单例通报全局状态,只管依靠接口编程。
在框架(如Spring)中,只管利用
容器
管理的单例Bean而非手动实现。
通过公道选择实现方式,单例模式能有效管理全局资源,但需审慎利用以克制计划上的陷阱。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
本帖子中包含更多资源
您需要
登录
才可以下载或查看,没有账号?
立即注册
×
回复
使用道具
举报
返回列表
大连密封材料
+ 我要发帖
×
登录参与点评抽奖,加入IT实名职场社区
去登录
微信订阅号
微信服务号
微信客服(加群)
H5
小程序
快速回复
返回顶部
返回列表