单例模式
单例模式有:饿汉,懒汉,静态内部类,枚举,双检锁(最优的就是枚举:没有为什么)
1)饿汉:jvm加载类时,就加载了单例对象,造成了资源的浪费
public class A{
private A(){
}
private static A a = new A();
public static A getInstance(){
return a;
}
}
2)懒汉:会有多线程同步问题(等被调用时才申明对象,且会申明一个静态的)
public class A{
private A(){
}
private static A a;
public static A getInstance(){
if(a==null)
a=new A();
return a;
}
}
懒汉和饿汉最大的区别就是
饿汉在类加载或程序启动时,类对象就被加载完成
懒汉需等类被第一次初始化时,单例模式才会生成单例对象
3)枚举:
enum Single {
Single;
private Single() {
}
public void print(){
System.out.println("hello world");
}
}
public class SingleDemo {
public static void main(String[] args) {
Single a = Single.Single;
a.print();
}
}
4)加锁的:
//同步函数的demo(将生成单例对象的方法加锁)
优点:解决了多线程的同步问题
缺点:本来只需在第一次初始化单例对象进行同步(防止生成多个对象),此方法需每一次调用都需同步,造成了性能问题
public static synchronized Single1 getInstance() {
if (s == null)
s = new Single1();
return s;
}
//同步代码快的demo加锁,安全高效(双检锁),
优点:也解决了多线程的同步问题,减缓了单锁的性能问题
缺点:
public static Single1 getInStanceBlock(){
if(s==null) //只有当对象为空时,在会造成同步效果,
synchronized (Single1.class) {
if(s==null) //第二把锁是防止,其他线程在前一个线程创建完单例对象后,在重复创建
s = new Single1();
}
return s;
}
注意点:
• 单例模式不会被jvm垃圾回收的
• 实现单例模式需要私有构造器(防止外面在构造对象)、一个静态变量(用于保存单例对象)、一个静态方法(可以直接Class.方法调用)
• 使用多个类加载器时,可能导致单例失效,产生多个实例,解决:自行指定类加载器,并指定同一个类加载器。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· 什么是nginx的强缓存和协商缓存
· 一文读懂知识蒸馏
· Manus爆火,是硬核还是营销?