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 单例模式的实例详解
# 多线程
# 多个
# 时再
# 加载
# 是一种
# 还没
# 本帖
# 你还
# 这段
# 效率高
# 在某些
# 可以通过
# 希望能
# 不存在
# 很可能
# 较低
# 会使
# 谢谢大家
# 提供一个
# 设置为
相关文章:
建站之星后台搭建步骤解析:模板选择与产品管理实操指南
C#如何使用XPathNavigator高效查询XML
建站之星后台密码遗忘?如何快速找回?
建站主机如何选?高性价比方案全解析
平台云上自助建站如何快速打造专业网站?
建站之星图片链接生成指南:自助建站与智能设计教程
简易网站制作视频教程,使用记事本编写一个简单的网页html文件?
如何用虚拟主机快速搭建网站?详细步骤解析
天河区网站制作公司,广州天河区如何办理身份证?需要什么资料有预约的网站吗?
用v-html解决Vue.js渲染中html标签不被解析的问题
定制建站流程解析:需求评估与SEO优化功能开发指南
公司网站设计制作厂家,怎么创建自己的一个网站?
网站制作员失业,怎样查看自己网站的注册者?
网站制作软件免费下载安装,有哪些免费下载的软件网站?
建站主机选购指南与交易推荐:核心配置解析
较简单的网站制作软件有哪些,手机版网页制作用什么软件?
建站之星与建站宝盒如何选择最佳方案?
枣阳网站制作,阳新火车站打的到仙岛湖多少钱?
Swift中switch语句区间和元组模式匹配
如何用美橙互联一键搭建多站合一网站?
免费公司网站制作软件,如何申请免费主页空间做自己的网站?
青岛网站设计制作公司,查询青岛招聘信息的网站有哪些?
如何在阿里云域名上完成建站全流程?
网页设计网站制作软件,microsoft office哪个可以创建网页?
企业网站制作公司网页,推荐几家专业的天津网站制作公司?
如何通过万网虚拟主机快速搭建网站?
已有域名和空间如何搭建网站?
成都品牌网站制作公司,成都营业执照年报网上怎么办理?
怀化网站制作公司,怀化新生儿上户网上办理流程?
网站制作公司排行榜,抖音怎样做个人官方网站
制作网站公司那家好,网络公司是做什么的?
历史网站制作软件,华为如何找回被删除的网站?
网站制作报价单模板图片,小松挖机官方网站报价?
佛山企业网站制作公司有哪些,沟通100网上服务官网?
建站主机助手选型指南:2025年热门推荐与高效部署技巧
个人网站制作流程图片大全,个人网站如何注销?
香港服务器如何优化才能显著提升网站加载速度?
视频网站制作教程,怎么样制作优酷网的小视频?
家具网站制作软件,家具厂怎么跑业务?
,怎么在广州志愿者网站注册?
专业的网站制作设计是什么,如何制作一个企业网站,建设网站的基本步骤有哪些?
东莞专业网站制作公司有哪些,东莞招聘网站哪个好?
如何选择靠谱的建站公司加盟品牌?
临沂网站制作公司有哪些,临沂第四中学官网?
网站制作话术技巧,网站推广做的好怎么话术?
如何撰写建站申请书?关键要点有哪些?
如何获取开源自助建站系统免费下载链接?
宝塔Windows建站如何避免显示默认IIS页面?
建站主机服务器选型指南与性能优化方案解析
*请认真填写需求信息,我们会在24小时内与您取得联系。