详解java 单例模式及方法总结
发布时间 - 2026-01-11 01:13:38 点击率:次java设计模式--单例模式

单例设计模式
Singleton是一种创建型模式,指某个类采用Singleton模式,则在这个类被创建后,只可能产生一个实例供外部访问,并且提供一个全局的访问点。
核心知识点如下:
(1) 将采用单例设计模式的类的构造方法私有化(采用private修饰)。
(2) 在其内部产生该类的实例化对象,并将其封装成private static类型。
(3) 定义一个静态方法返回该类的实例。
/**
* 方法一
* 单例模式的实现:饿汉式,线程安全 但效率比较低
*/
public class SingletonTest {
// 定义一个私有的构造方法
private SingletonTest() {
}
// 将自身的实例对象设置为一个属性,并加上Static和final修饰符
private static final SingletonTest instance = new SingletonTest();
// 静态方法返回该类的实例
public static SingletonTest getInstancei() {
return instance;
}
}
方法一就是传说的中的饿汉模式
优点是:写起来比较简单,而且不存在多线程同步问题,避免了synchronized所造成的性能问题;
缺点是:当类SingletonTest被加载的时候,会初始化static的instance,静态变量被创建并分配内存空间,从这以后,这个static的instance对象便一直占着这段内存(即便你还没有用到这个实例),当类被卸载时,静态变量被摧毁,并释放所占有的内存,因此在某些特定条件下会耗费内存。
/**
*方法二
* 单例模式的实现:饱汉式,非线程安全
*
*/
public class SingletonTest {
// 定义私有构造方法(防止通过 new SingletonTest()去实例化)
private SingletonTest() {
}
// 定义一个SingletonTest类型的变量(不初始化,注意这里没有使用final关键字)
private static SingletonTest instance;
// 定义一个静态的方法(调用时再初始化SingletonTest,但是多线程访问时,可能造成重复初始化问题)
public static SingletonTest getInstance() {
if (instance == null)
instance = new SingletonTest();
return instance;
}
}
方法二就是传说的中的饱汉模式
优点是:写起来比较简单,当类SingletonTest被加载的时候,静态变量static的instance未被创建并分配内存空间,当getInstance方法第一次被调用时,初始化instance变量,并分配内存,因此在某些特定条件下会节约了内存;
缺点是:并发环境下很可能出现多个SingletonTest实例。
/**
*方法三
* 单例模式的实现:饱汉式,线程安全简单实现
*
*/
public class SingletonTest {
// 定义私有构造方法(防止通过 new SingletonTest()去实例化)
private SingletonTest() {
}
// 定义一个SingletonTest类型的变量(不初始化,注意这里没有使用final关键字)
private static SingletonTest instance;
// 定义一个静态的方法(调用时再初始化SingletonTest,使用synchronized 避免多线程访问时,可能造成重的复初始化问题)
public static synchronized SingletonTest getInstance() {
if (instance == null)
instance = new SingletonTest();
return instance;
}
}
方法三为方法二的简单优化
优点是:使用synchronized关键字避免多线程访问时,出现多个SingletonTest实例。
缺点是:同步方法频繁调用时,效率略低。
/**
* 方法四
* 单例模式最优方案
* 线程安全 并且效率高
*
*/
public class SingletonTest {
// 定义一个私有构造方法
private SingletonTest() {
}
//定义一个静态私有变量(不初始化,不使用final关键字,使用volatile保证了多线程访问时instance变量的可见性,避免了instance初始化时其他变量属性还没赋值完时,被另外线程调用)
private static volatile SingletonTest instance;
//定义一个公有的静态方法,返回该类型实例
public static SingletonTest getIstance() {
// 对象实例化时与否判断(不使用同步代码块,instance不等于null时,直接返回对象,提高运行效率)
if (instance == null) {
//同步代码块(对象未初始化时,使用同步代码块,保证多线程访问时对象在第一次创建后,不再重复被创建)
synchronized (SingletonTest.class) {
//未初始化,则初始instance变量
if (instance == null) {
instance = new SingletonTest();
}
}
}
return instance;
}
}
方法四为单例模式的最佳实现。内存占用地,效率高,线程安全,多线程操作原子性。
(事实上,可以通过Java反射机制来实例化private类型的构造方法,此时基本上会使所有的Java单例实现失效。本帖不讨论反射情况下问题,默认无反射,也是常见的面试已经应用场景)
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
# java
# 单例模式
# 单例模式详解
# Java单例模式简单介绍
# Java单例模式实现静态内部类方法示例
# java 单例模式(饿汉模式与懒汉模式)
# java设计模式之单例模式解析
# JAVA 枚举单例模式及源码分析的实例详解
# java设计模式之单例模式的详解及优点
# java 单例模式和工厂模式实例详解
# JAVA多线程并发下的单例模式应用
# java 单例模式的实例详解
# 多线程
# 多个
# 时再
# 加载
# 是一种
# 还没
# 本帖
# 你还
# 这段
# 效率高
# 在某些
# 可以通过
# 希望能
# 不存在
# 很可能
# 较低
# 会使
# 谢谢大家
# 提供一个
# 设置为
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
车管所网站制作流程,交警当场开简易程序处罚决定书,在交警网站查询不到怎么办?
如何撰写建站申请书?关键要点有哪些?
网站建设保证美观性,需要考虑的几点问题!
如何在云指建站中生成FTP站点?
Win11搜索栏无法输入_解决Win11开始菜单搜索没反应问题【技巧】
HTML透明颜色代码怎么让下拉菜单透明_下拉菜单透明背景指南【技巧】
大连企业网站制作公司,大连2025企业社保缴费网上缴费流程?
大连网站制作费用,大连新青年网站,五年四班里的视频怎样下载啊?
湖南网站制作公司,湖南上善若水科技有限公司做什么的?
网站制作公司哪里好做,成都网站制作公司哪家做得比较好,更正规?
Laravel API路由如何设计_Laravel构建RESTful API的路由最佳实践
猎豹浏览器开发者工具怎么打开 猎豹浏览器F12调试工具使用【前端必备】
Laravel Docker环境搭建教程_Laravel Sail使用指南
深圳网站制作平台,深圳市做网站好的公司有哪些?
JS经典正则表达式笔试题汇总
Laravel Seeder怎么填充数据_Laravel数据库填充器的使用方法与技巧
Laravel如何实现一对一模型关联?(Eloquent示例)
Laravel Admin后台管理框架推荐_Laravel快速开发后台工具
微信小程序 canvas开发实例及注意事项
js实现点击每个li节点,都弹出其文本值及修改
EditPlus中的正则表达式 实战(4)
如何在Windows环境下新建FTP站点并设置权限?
Laravel如何安装使用Debugbar工具栏_Laravel性能调试与SQL监控插件【步骤】
制作公司内部网站有哪些,内网如何建网站?
Laravel的.env文件有什么用_Laravel环境变量配置与管理详解
Laravel如何集成微信支付SDK_Laravel使用yansongda-pay实现扫码支付【实战】
网站广告牌制作方法,街上的广告牌,横幅,用PS还是其他软件做的?
独立制作一个网站多少钱,建立网站需要花多少钱?
香港服务器选型指南:免备案配置与高效建站方案解析
Laravel怎么进行数据库回滚_Laravel Migration数据库版本控制与回滚操作
如何使用 Go 正则表达式精准提取括号内首个纯字母标识符(忽略数字与嵌套)
Laravel如何实现用户注册和登录?(Auth脚手架指南)
小米17系列还有一款新机?主打6.9英寸大直屏和旗舰级影像
html5audio标签播放结束怎么触发事件_onended回调方法【教程】
Laravel如何集成Inertia.js与Vue/React?(安装配置)
高防服务器:AI智能防御DDoS攻击与数据安全保障
JavaScript中如何操作剪贴板_ClipboardAPI怎么用
头像制作网站在线观看,除了站酷,还有哪些比较好的设计网站?
在线制作视频的网站有哪些,电脑如何制作视频短片?
edge浏览器无法安装扩展 edge浏览器插件安装失败【解决方法】
Laravel如何使用Eloquent ORM进行数据库操作?(CRUD示例)
微信小程序 HTTPS报错整理常见问题及解决方案
uc浏览器二维码扫描入口_uc浏览器扫码功能使用地址
详解Nginx + Tomcat 反向代理 如何在高效的在一台服务器部署多个站点
Laravel如何实现密码重置功能_Laravel密码找回与重置流程
Laravel如何获取当前用户信息_Laravel Auth门面获取用户ID
JavaScript如何实现音频处理_Web Audio API如何工作?
微信小程序 scroll-view组件实现列表页实例代码
Win11怎么开启自动HDR画质_Windows11显示设置HDR选项
Python制作简易注册登录系统

