首页 > 其他分享 >设计模式(7)--单例模式

设计模式(7)--单例模式

时间:2023-01-06 10:34:02浏览次数:61  
标签:SingleTon -- private uniqueInstance static 单例 设计模式 public


  • 单例模式的意义:
  • 用到的类的对象只能有一个(线程池,缓存,打印机等硬件设备)。
  • 如果多个实例会有造成冲突、结果不一致等问题
  • 可以用静态变量来指代这个对象来实现
  • 协商一个全局变量实现单例模式
  • 单例模式的意义:确保一个类最多只有一个实例,并提供一个全局访问点。
  • 经典单例模式类图结构:
  • 构造函数是私有的保证在外面无法调用构造函数,在里面有一个static getInstance()方法来进行创建一个实例
  • 经典单例模式的代码:
package jingdiandanli;


/**
* Created with IntelliJ IDEA.
* Description:
* User: wjx
* Date: 2019-04-16
* Time: 10:01
*/
public class SingleTon {
private static SingleTon uniqueInstance = null;
private SingleTon(){

}
public static SingleTon getInstance(){
if(uniqueInstance == null){
uniqueInstance = new SingleTon();
}
return uniqueInstance;
}
}
  • 经典单例模式的优化:
  • 多线程问题:比如巧克力工厂:上面的代码解决了巧克力工厂只有一个但要在多个地方同步的问题。
  • 多线程情况下如果两个线程获取单例对象的某个实例的时候,会因时间片切换的时候,new出多个对象,无法保证唯一性。
  • 解决:
public class SingleTon {
private static SingleTon uniqueInstance = null;
private SingleTon(){


}
public static synchronized SingleTon getInstance(){ //保证线程安全
if(uniqueInstance == null){
uniqueInstance = new SingleTon();
}
return uniqueInstance;
}
}
  • 但是同步锁消耗资源较多,如果要经常调用getInstance(),消耗较多的资源
  • 解决:急切创建:
public class SingleTon {
private static SingleTon uniqueInstance = new SingleTon;//不管哪个线程先执行所以已经创建
private SingleTon(){


}
public static SingleTon getInstance(){
if(uniqueInstance == null){
uniqueInstance = new SingleTon();
}
return uniqueInstance;
}
}
  • 但是在执行的过程中,不要一定需要这个对象的实例。所以浪费了内存
  • 解决:双重检查加锁:
public class SingleTon {
private volatile static SingleTon uniqueInstance = null; //处理多线程安全
private SingleTon(){


}
public static SingleTon getInstance(){
//因为刚开始只要有一个进入就会创建相应的实例,如果第二次在进入就会进入第一个判断对象就不是空,所以同步区域不会频繁调用,就不会消耗太多的资源
if(uniqueInstance == null){
synchronized(SingleTon.class){
if(uniqueInstance == null){
uniqueInstance = new SingleTon();
}
}
}
return uniqueInstance;
}
}


标签:SingleTon,--,private,uniqueInstance,static,单例,设计模式,public
From: https://blog.51cto.com/u_13987312/5992411

相关文章

  • linux定时任务
    1.Crontab命令文件保存在/var/spool/cron下crontab[-u<用户名称>][配置文件]或crontab{-l|-r|-e}-u#<用户名称>是指设定指定<用户名称>的定时任务,这个......
  • 混合模式(二)
    PorterDuffXfermode该模式针对的时在处理结果时以源图像显示为主的模式,主要有:Mode.SRC,Mode.SRC_IN,Mode.SRC_OUT,Mode.SRC_OVER和Mode.SRC_ATOPMode.SRC://全部以源图像......
  • .Net 7 内存模型函数描述结构MethoDesc
    楔子讲一些CLR里面的内存模型。本篇MethodDesc,意为函数的描述之意,看下一个函数在CLR里面是如何被描述的。MethodDesc结构这个结构体在CLR里面高达1600多行,这里仅截取......
  • 亚马逊UL测试报告详情
    UL认证和UL测试报告有那些区别1、UL检测报告:是根据产品选用相应UL标准进行测试合格后,出具合格的测试报告。(UL测试报告是针对亚马逊的)2、UL认证:UL认证自愿申请的,是全球认可度......
  • BitmapFactory.Options参数作用
    参数作用BitmapFactory.Options这个参数可以设置Bitmap的采样率,通过该比那图片的宽度、高度、缩放比例等,以达到减少图片的像素的目的,设置这个值可以更好的控制、显示和使用B......
  • SpringBoot过滤器/拦截器
    不同点项过滤器拦截器使用场景对请求/响应进行修改、判断等。一般用于过滤参数、登录权限验证、资源访问权限控制、敏感词汇过滤、字符编码转换。在service或者一个方法前......
  • 设计模式(5)--适配器模式
    首先声明鸭子和火鸡的接口packageshipeiqi;publicinterfaceDuck{publicvoidgaga();publicvoidfly();}publicinterfaceTurkey{publicvoidgogo();......
  • Json-Tutorial04 Unicode解析
    前言本节实际上做的工作是上一节的遗留工作:\u转义字符的解析。UTF-8的解析规则在本教程所设计的Json库中,只涉及UTF-8的解析。具体的解析规则教程中都已经说的非常清楚了......
  • 小米:阳了,被裁了
    hi大家好,我是DHL。公众号:ByteCode,专注有用、有趣的硬核原创内容,Kotlin、Jetpack、性能优化、系统源码、算法及数据结构、大厂面经。随着防疫政策的放开,小阳人越来越多......
  • Zabbix与乐维监控对比分析(七)——网络功能篇
    前面我们详细介绍了Zabbix与乐维监控在架构与性能、Agent管理、自动发现、权限管理、对象管理、告警管理、可视化及图形图表方面的对比分析,接下来我们将对二者网络功能方面......