软件设计模式之单例模式
设计模式之单例模式
定义
保证一个类仅有一个实例,并提供一个全局访问点
类型
创建型
使用场景
想确保任何情况下都绝对只有一个实例
优点
在内存里只有一个实例,减少了内存开销。
可以避免对资源的多重占用。
设置全局访问点,严格控制访问。
缺点
没有接口,扩展困难
重点
- 私有构造器
- 线程安全
- 延迟加载,想使用的时候再创建
- 序列化和反序列化安全
- 反射:防止反射攻击
实用技能
- 反编译
- 内存原理
- 多线程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.定义及理解 1.1 定义 1.2 特点 1.3 类图 1.3.1结构说 ...
- C#设计模式(1)——单例模式
原文地址:http://www.cnblogs.com/zhili/p/SingletonPatterm.html 一.引言 最近在设计模式的一些内容,主要的参考书籍是<Head First 设 ...
- go设计模式之单例模式
在这里插入图片描述# go设计模式之单例模式 在软件开发时,经常会遇到有些对象需要保证只有一个实例的,那么这种设计模式就应用而生. 定义 单例模式,也叫单子模式,是一种常用的软件设计模式,属于创建型模 ...
- 设计模式之单例模式——Singleton
设计模式之单例模式--Singleton 设计意图: 保证类仅有一个实例,并且可以供应用程序全局使用.为了保证这一点,就需要这个类自己创建自己的对象,并且对外有 ...
- 【系统架构设计师】软考高级职称,一次通过,倾尽所有,2016年下半年系统架构设计师考试论文真题(论述软件设计模式技术及应用)
[系统架构设计师]软考高级职称,一次通过,倾尽所有,看完这篇就够了,学习方法和技巧这里全都有. 2016年下半年系统架构设计师考试论文真题(论述软件设计模式技术及应用) 论软件设计模式及其应用 软件设 ...
- java connection 单例_Java设计模式之单例模式详解
Java设计模式之单例模式详解 什么是设计模式 设计模式是在大量的实践中总结和理论之后优选的代码结构,编程风格,以及解决问题的思考方式.使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代码可 ...
- 软件设计模式—命令模式
前篇--软件设计模式-基础 前篇--软件设计模式-三种工厂模式 前篇--软件设计模式-装饰者模式 前篇--软件设计模式-单例模式 前篇--软件设计模式-原型模式 命令模式是对象行为型模式 目录 1. ...
最新文章
- 由粗到精学习LVI-SAM基础:多传感器内外参标定原理
- redis延迟消息队列不准时php,Redis实现延迟消息队列
- log4j的配置参数
- 解释器和编译器的区别
- 2014年职称计算机word2003,2014年职称计算机考试Word2003模拟题及答案5
- linux每日命令(11):cat命令
- Material Design使用集合
- 由于未安装.net framework 4.0的miscrosoft office支持,无法加载以下解决方案 ***.vsto
- 汇总了25个FPGA开源网站和前10大FPGA论坛
- COCO数据集转VOC之检测
- twitter_关于Twitter和激进化的警告
- win7 ie11 uninstall卸载
- python高阶学习之一:c++调用python
- 正方验证码智能识别及教务系统模拟登录
- 利用匿名管道实现远程CMD---我的解读
- 复旦大学日月光华BBS进站画面和壁纸
- 谈谈这些IT草根创业者
- matplotlib包和gif包生成gif动画对比
- Tomcat设置SSO后报告错误 Defective token detected
- DC系列靶机DC-1