Java 单例模式
饿汉式:
- 构造器私有化 => 防止直接new
- 类内部创建对象赋予static变量
- 向外暴露static公共方法,返回类实例变量
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | package com; public class Singleton { private String name; public static int n = 22; private static Singleton singleton = new Singleton( "singleton" ); private Singleton(String name) { System. out .println( "constructor was called" ); this .name = name; } public static Singleton getInstance() { return singleton; } @Override public String toString() { return "Singleton{" + "name='" + name + '\ '' + '}' ; } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | package com; import org.jetbrains.annotations.NotNull; public class Test { public static void main(String @NotNull [] args) { Singleton s1 = Singleton.getInstance(); Singleton s2 = Singleton.getInstance(); System. out .println(s1==s2); System. out .println(s1); System. out .println(s2); } } |
懒汉式
- 构造器私有化
- 定义static类属性保存实例
- 提供public static方法返回static类属性保存的实例
- 只有当用户使用getInstance时,才返回构造实例,再次调用,返回之前创建的实例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | package com; public class Singleton { private String name; public static int n = 33; private static Singleton singleton; // default null private Singleton(String name) { System. out .println( "constructor was called" ); this .name = name; } @Override public String toString() { return "Singleton{" + "name='" + name + '\ '' + '}' ; } public static Singleton getInstance(String name) { if (singleton == null ) { singleton = new Singleton(name); } return singleton; } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | package com; import org.jetbrains.annotations.NotNull; public class Test { public static void main(String @NotNull [] args) { System. out .println(Singleton.n); // Singleton s1 = Singleton.getInstance("s1"); // Singleton s2 = Singleton.getInstance("s2"); // System.out.println(s1==s2); // System.out.println(s1); // System.out.println(s2); } } |
二者区别:
1: 创建时机不同,饿汉式类加载时就创建了对象实例,懒汉式getInstance时才创建
2: 饿汉式不存在线程安全问题,懒汉式存在线程安全问题
3: 饿汉式存在浪费资源的可能,懒汉式使用时才创建
4: javaSE标准类中,java.lang.Runtime就是单例模式
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律