单例模式主要用来产生一个对象的具体实例,它可以确保系统中一个类只产生一个实例。

两个好处:

  • 对于频繁使用的对象,可以省略new操作花费的时间
  • new的次数少了,对系统内存的使用频率就小了,那么GC压力就会降低,缩短了GC停顿时间

饿汉式单例模式:

public class Singleton {private Singleton() {System.out.println("Singleton iscreate");}private static Singleton instance = new Singleton();private static Singleton getInstance() {return instance;}
}

私有化构造方法的作用:不能new这个类的实例,从而避免该类被错误的创建

因此要想获取这个对象,只能调用getInstance()工厂方法,构造方法被私有化,要想这个方法可以被调用,所以这个方法必须用static修饰,调用方式:类.方法名

从而instance也必须用static修饰。

好处:性能非常好,getInstance()方法只是简单的返回instance,并没有任何锁操作,所以在并行程序中它会有很好的表现

坏处:Singleton构造函数或者说Singleton实例在什么时候创建是不受控制的,对于静态成员instance,它会在类第一次初始化的时候被创建,并不是第一次调用getInstance()方法的时候被创建的

延伸一点:static修饰的成员变量所属类被加载的时候,变量间会被分配空间,及就会被创建

懒汉式单例模式:

public class LazySingleton {private LazySingleton() {System.out.println("LazySingleton is create");}private static LazySingleton instance = null;private static synchronized LazySingleton getInstance() {if (instance == null)instance = new LazySingleton();return instance;}
}

私有化构造方法的作用:不能new这个类的实例,从而避免该类被错误的创建

只有当调用getInstance()方法时才会创建单例对象,为了防止对象被多次创建,还须要使用synchronized进行方法同步

好处:充分利用了延迟加载,只有在真正需要时才会创建对象

坏处:并发环境下加锁,竞争激烈的场合对性能会产生一定影响

另外还有一种,双重判断加双同步(安全又高效):

public class SingleTon {private static volatile SingleTon singleTon = null;private SingleTon() {}public static SingleTon getInstance() {if (singleTon == null) {synchronized (SingleTon.class) {if (singleTon == null) {singleTon = new SingleTon();}}}return singleTon;}
}

为什么双重判断:
如果单层if判断,在服务器允许的情况下,假设有一百个线程,耗费的时间为100*(同步判断时间+if判断时间),而如果双重if判断,100的线程可以同时if判断,理论消耗的时间只有一个if判断的时间。
所以如果面对高并发的情况,而且采用的是懒汉模式,最好的选择就是双重判断加同步的方式。

转载于:https://www.cnblogs.com/java-spring/p/9075670.html

单例模式之懒汉式/饿汉式/结合二者之优的模式相关推荐

  1. 单例模式:懒汉式 饿汉式 双检锁 登记式 枚举式 详细讲解

    单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式. 这种模式涉及到一个单一的类,该类负责创建自己的对 ...

  2. Java单例模式【懒汉式饿汉式】

    目录 一. 单例模式的解释 二. 实现方法 2.1 饿汉式 2.1.1饿汉式的实现代码 2.2 懒汉式 2.2.1懒汉式的实现代码 三. 单例设计模式的好处 3.1单例模式的应用场景 一. 单例模式的 ...

  3. 单例模式【懒汉式+饿汉式+枚举】

    软件设计模式(Software Design Pattern) 又称设计模式,是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.它描述了在软件设计过程中的一些不断重复发生的问题,以及 ...

  4. Spring框架学习day_01: 框架配置方式/ 管理对象的作用域/ 生命周期/ 组件扫描/ 单例模式:“懒汉式“,“饿汉式“

    1. Spring框架的作用 Spring框架的主要作用是创建对象和管理对象. 创建对象:类似于User user = new User(); 管理对象:随时可以通过Spring框架获取对象,甚至Sp ...

  5. Singleton模式(单例模式) 饿汉式和懒汉式

    目的:整个应用中有且只有一个实例,所有指向该类型实例的引用都指向这个实例. 好比一个国家就只有一个皇帝(XXX),此时每个人叫的"皇帝"都是指叫的XXX本人; 常见单例模式类型: ...

  6. 单例模式饿汉式/懒汉式的区别

    単例设计模式(Singleton Pattern): 所谓类的单例设计模式,就是采取一定的方法保证在整个的软件系统中,对某个类只能存在一个对象实例,并且该类只提供一个取得其对象实例的方法. 如果我们要 ...

  7. 【无标题】单例模式的两种创建方式:饿汉式和懒汉式

    这里写自定义目录标题 单例模式的两种创建方式:饿汉式和懒汉式 欢迎使用Markdown编辑器 新的改变 功能快捷键 合理的创建标题,有助于目录的生成 如何改变文本的样式 插入链接与图片 如何插入一段漂 ...

  8. 单例模式中懒汉式和饿汉式的区别区别在哪?

    一.单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式.所谓单例就是在系统中只有一个该类的实例,或者说 ...

  9. 饿汉式单例模式与懒汉式单例模式

    饿汉式单例模式 GiantDragon 应该只有一只,通过私有化其构造方法,使得外部无法通过new 得到新的实例. GiantDragon 提供了一个public static的getInstance ...

最新文章

  1. mysql 5.5 1366错误_laravel5.3 在 mysql5.1中运行出错 error: 1366 Incorrect integer
  2. Docker应用五:使用Dockerfile部署MongoDB
  3. c语言水仙桃树编程,辰颐物语编辑部整理:春季适合种植哪些花卉品种?樱花和桃花怎么区分?...
  4. 路由器用到坏才换?路由器你在乎哪些功能?
  5. 【AIX】AIX 开机自动挂载NFS共享
  6. IE下table的innerHTML无效的处理方法
  7. python百度贴吧怎么爬取最早的帖子_Python爬虫爬取百度贴吧的帖子
  8. xftp传输文件报错
  9. PAT-求特殊方程的正整数解(简单编程题)
  10. 目标检测经典论文——YOLOv1论文翻译(纯中文版):YOLO:统一的实时目标检测
  11. 如何登录虚拟主机服务器,如何登录虚拟主机服务器
  12. 一亿用户背后架构的秘密
  13. 上电瞬间电容相当于短路
  14. 栈的应用之中缀表达式转后缀
  15. 交换机-链路冗余、链路聚合、堆叠、热备、虚拟化
  16. 版权保护利用区块链是否可以体现优势?
  17. 手电筒充放电管理芯片SM5401兼容HT4892 超低静态电流 低成本充放电管理芯片 移动电源芯片
  18. 【杂谈】杠精的葵花宝典
  19. 华科考研计算机专业课,华科计算机考研专业课有哪些
  20. 2022年七夕礼物推荐!好看便宜又实用的礼物推荐

热门文章

  1. c++服务器开源项目,开源一个c++ lua服务器框架
  2. linux分区 挂盘,linux分区与格式化磁盘挂载磁盘与自动挂载详细教程
  3. php yii2 finfo file,FileHelper:文件系统助手
  4. matlab中nsamp,matlab用于数字调制,几个函数的使用问题
  5. 高性能MySQL数据库(含二级考试)-张晨光-专题视频课程
  6. 干货|各种WAF绕过手法学习
  7. 记录mysql中的隐患特性
  8. freemarker迭代list、map等常规操作
  9. Python输入多行多组数据两个两求和
  10. sklearn综合示例5:多分类分类器