设计模式之单例模式

定义

保证一个类仅有一个实例,并提供一个全局访问点

类型

创建型

使用场景

想确保任何情况下都绝对只有一个实例

优点

在内存里只有一个实例,减少了内存开销。
可以避免对资源的多重占用。
设置全局访问点,严格控制访问。

缺点

没有接口,扩展困难

重点

  • 私有构造器
  • 线程安全
  • 延迟加载,想使用的时候再创建
  • 序列化和反序列化安全
  • 反射:防止反射攻击

实用技能

  • 反编译
  • 内存原理
  • 多线程Debug

相关设计模式

  • 单例模式和工厂模式
  • 单例模式和享元模式

懒汉模式

在需要的时候才实例化对象。
但是这种模式会存在线程安全问题。

传统懒汉模式

代码如下:

public class LazySingleton {private static LazySingleton lazySingleton = null;/*** 私有构造器*/private LazySingleton() {}public static LazySingleton getInstance() {if (lazySingleton == null) {lazySingleton = new LazySingleton();}return lazySingleton;}
}

双重检查懒汉模式

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

JVM创建对象有以下几步:

1、给对象分配内存空间;
2、初始化对象;
3、设置实例指向刚分配的内存地址;
4、初次访问对象。

但是在实际的创建对象的过程中,2,3两步有可能出现指令重排,也就是先执行3,2的顺序,这种改变在单线程中是没有问题的,实际在多线程中也没太大的问题,只是出现极端情况下,会出现问题,如下图所示:

volatile有两个作用:内存可见性和禁止指令重排。在这段代码中保证了指令的顺序性,不会重排序。

案例

  • 线程池
  • 日志操作

转载于:https://www.cnblogs.com/xiaotutu365/p/10367496.html

软件设计模式之单例模式相关推荐

  1. 软件设计模式之单例模式-----身份证号码---打印池

    实例一:身份证号码 在现实生活中,居民身份证号码具有唯一性,同一个人不允许有多个身份证号码,第一次申请身份证时将给居民分配一个身份证号码,如果之后因为遗失等原因补办时,还是使用原来的身份证号码,不会产 ...

  2. 软件设计模式“单例模式”和“工厂模式”

    软件设计模式"单例模式"和"工厂模式" 单例模式 什么是单例模式 单例模式的实现方式有哪些 单例模式的优缺点 单例模式的应用场景 总结 工厂模式 什么是工厂模式 ...

  3. 软件设计模式—单例模式

    前篇--软件设计模式-基础 前篇--软件设计模式-三种工厂模式 前篇--软件设计模式-装饰者模式 单例模式是创建型模式 目录 1.定义及理解 1.1 定义 1.2 特点 1.3 类图 1.3.1结构说 ...

  4. C#设计模式(1)——单例模式

    原文地址:http://www.cnblogs.com/zhili/p/SingletonPatterm.html 一.引言 最近在设计模式的一些内容,主要的参考书籍是<Head First 设 ...

  5. go设计模式之单例模式

    在这里插入图片描述# go设计模式之单例模式 在软件开发时,经常会遇到有些对象需要保证只有一个实例的,那么这种设计模式就应用而生. 定义 单例模式,也叫单子模式,是一种常用的软件设计模式,属于创建型模 ...

  6. 设计模式之单例模式——Singleton

                        设计模式之单例模式--Singleton 设计意图: 保证类仅有一个实例,并且可以供应用程序全局使用.为了保证这一点,就需要这个类自己创建自己的对象,并且对外有 ...

  7. 【系统架构设计师】软考高级职称,一次通过,倾尽所有,2016年下半年系统架构设计师考试论文真题(论述软件设计模式技术及应用)

    [系统架构设计师]软考高级职称,一次通过,倾尽所有,看完这篇就够了,学习方法和技巧这里全都有. 2016年下半年系统架构设计师考试论文真题(论述软件设计模式技术及应用) 论软件设计模式及其应用 软件设 ...

  8. java connection 单例_Java设计模式之单例模式详解

    Java设计模式之单例模式详解 什么是设计模式 设计模式是在大量的实践中总结和理论之后优选的代码结构,编程风格,以及解决问题的思考方式.使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代码可 ...

  9. 软件设计模式—命令模式

    前篇--软件设计模式-基础 前篇--软件设计模式-三种工厂模式 前篇--软件设计模式-装饰者模式 前篇--软件设计模式-单例模式 前篇--软件设计模式-原型模式 命令模式是对象行为型模式 目录 1. ...

最新文章

  1. 由粗到精学习LVI-SAM基础:多传感器内外参标定原理
  2. redis延迟消息队列不准时php,Redis实现延迟消息队列
  3. log4j的配置参数
  4. 解释器和编译器的区别
  5. 2014年职称计算机word2003,2014年职称计算机考试Word2003模拟题及答案5
  6. linux每日命令(11):cat命令
  7. Material Design使用集合
  8. 由于未安装.net framework 4.0的miscrosoft office支持,无法加载以下解决方案 ***.vsto
  9. 汇总了25个FPGA开源网站和前10大FPGA论坛
  10. COCO数据集转VOC之检测
  11. twitter_关于Twitter和激进化的警告
  12. win7 ie11 uninstall卸载
  13. python高阶学习之一:c++调用python
  14. 正方验证码智能识别及教务系统模拟登录
  15. 利用匿名管道实现远程CMD---我的解读
  16. 复旦大学日月光华BBS进站画面和壁纸
  17. 谈谈这些IT草根创业者
  18. matplotlib包和gif包生成gif动画对比
  19. Tomcat设置SSO后报告错误 Defective token detected
  20. DC系列靶机DC-1

热门文章

  1. 如何全局自动化注册异步组件?
  2. TaskBarProgress(任务栏进度条)
  3. 若依集成redisson实现redis分布式锁
  4. Java事务管理之Spring+Hibernate
  5. 加号和减号在一起怎么读_在家摄影怎么玩?拍摄小黄米场景搭建,摄影软件和修图软件介绍...
  6. STM32之PWM波
  7. Python 将输出内容保存在text文件中
  8. MySQL中的datetime对应Java类型
  9. Linux下的wc命令
  10. win10树莓派改ip_在树莓派2上安装 Windows 10