设计模式之单例模式实践
概念
单例模式即一个JVM内存中只存在一个类的对象实例
分类
1、懒汉式
类加载的时候就创建实例
2、饿汉式
使用的时候才创建实例
当然还有其他的生成单例的方式,双重校验锁,枚举和静态内部类,文中会有介绍
实践
懒汉式
1)线程不安全,不可用
public class Singleton { private static Singleton instance; private Singleton (){} public static Singleton getInstance() { if (instance == null) { instance = new Singleton(); } return instance; } }
2)线程安全,同步方法,效率低,不推荐
public class Singleton { private static Singleton instance; private Singleton (){} public static synchronized Singleton getInstance() { if (instance == null) { instance = new Singleton(); } return instance; } }
3)线程不安全,会产生多个实例,不可用
public class Singleton {private static Singleton singleton;private Singleton() {}public static Singleton getInstance() {if (singleton == null) {synchronized (Singleton.class) {singleton = new Singleton();}}return singleton;}
}
4) 饿汉式,无线程安全问题,不能延迟加载,影响系统性能
public class Singleton { private static Singleton instance = new Singleton(); private Singleton (){} public static Singleton getInstance() { return instance; } }
5)
public class Singleton { private static Singleton instance = null; static { instance = new Singleton(); } private Singleton (){} public static Singleton getInstance() { return instance; } }
6)双重校验锁,线程安全,推荐使用
public class Singleton {private static volatile Singleton singleton;private Singleton() {}public static Singleton getInstance() {if (singleton == null) {synchronized (Singleton.class) {if (singleton == null) {singleton = new Singleton();}}}return singleton;}}
7)静态内部类,线程安全,主动调用时才实例化,延迟加载效率高,推荐使用
public class Singleton { private static class SingletonHolder { private static final Singleton INSTANCE = new Singleton(); } private Singleton (){} public static final Singleton getInstance() { return SingletonHolder.INSTANCE; } }
8)枚举类型,无线程安全问题,避免反序列华创建新的实例,很少使用
public enum Singleton { INSTANCE; public void whateverMethod() { } }
注意事项
1、考虑多线程问题
2、单例类构造方法要设置为private类型禁止外界new创建
private Singleton() {}
3、如果类可序列化,考虑反序列化生成多个实例问题,解决方案如下
private Object readResolve() throws ObjectStreamException { // instead of the object we're on, return the class variable INSTANCE return INSTANCE; }
使用场景
1、工具类对象
2、系统中只能存在一个实例的类
3、创建频繁或又耗时耗资源且又经常用到的对象
下面是单例模式在JDK的应用
另外,spring容器中的实例默认是单例饿汉式类型的,即容器启动时就实例化bean到容器中,当然也可以设置懒汉式defalut-lazy-init="true"为延迟实例化,用到时再实例化。
设计模式之单例模式实践相关推荐
- 实践GoF的设计模式:单例模式
本文分享自华为云社区<[Go实现]实践GoF的23种设计模式:单例模式>,作者: 元闰子. 简述 GoF 对单例模式(Singleton)的定义如下: Ensure a class onl ...
- JavaScript设计模式与开发实践系列之单例模式
本系列为<JavaScript设计模式与开发实践>(作者:曾探)学习总结,如想深入了解,请支持作者原版 单例模式 实现单例模式 单例模式的定义是:保证一个类仅有一个实例,并提供一个访问它的 ...
- JavaScript设计模式与开发实践 - 单例模式
引言 本文摘自<JavaScript设计模式与开发实践> 在传统开发工程师眼里,单例就是保证一个类只有一个实例,实现的方法一般是先判断实例存在与否,如果存在直接返回,如果不存在就创建了再返 ...
- 《JavaScript设计模式与开发实践》阅读摘要
<JavaScript设计模式与开发实践>作者:曾探 系统的介绍了各种模式,以及js中的实现.应用,以及超大量高质量代码,绝对值得一读 面向对象的js 静态类型:编译时便已确定变量的类型 ...
- 专访《Javascript设计模式与开发实践》作者曾探:爱编程 爱生活
专访<Javascript设计模式与开发实践>作者曾探:爱编程 爱生活 发表于12小时前| 2742次阅读| 来源CSDN| 8 条评论| 作者夏梦竹 专访曾探图书作者Javascr ...
- javascript 设计模式之单例模式
单例模式是一种简单而非常实用的模式特别是惰性单例技术,下面例子贴出了单列模式的代码 <button id="loginBtn">登录</button>< ...
- java connection 单例_Java设计模式之单例模式详解
Java设计模式之单例模式详解 什么是设计模式 设计模式是在大量的实践中总结和理论之后优选的代码结构,编程风格,以及解决问题的思考方式.使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代码可 ...
- Javascript设计模式之单例模式
前言:菜鸡也有梦想,而我的梦想就是进一个真正的互联网大厂.以前学习的时候没有系统的整理,从今天开始要保持每周写博客的习惯,希望自己可以有所成长.为了培养编程思维,决定从设计模式开始写起.我是通过读&l ...
- javascript设计模式(javascript设计模式与开发实践读书笔记)
javascript设计模式(javascript设计模式与开发实践读书笔记) 单例模式 策略模式 代理模式 迭代器模式 发布-订阅模式 命令模式 组合模式 模板方法模式 享元模式 职责链模式 中介者 ...
最新文章
- 2021年用于图像处理的Python顶级库
- 利用CodeIgniter中的Email类发邮件
- 前端一HTML:十三:css的三大特性
- python 技术篇-使用logging日志模块自定义时间格式
- 页面滚动到指定class样式位置
- 计算机基础知识:什么是位、字节、字、KB、MB
- 聚水潭是如何基于AnalyticDB for PostgreSQL 构筑海量实时数仓平台的
- js方法写在html中,在js中写html代码怎么写
- 多表利用DIH批量导入数据并建立索引注意事项
- java停止循环label_Java中的break Label 和continue Label 例子(跳出多重循环)(转)...
- win10 flashcs6不能用了_听说这版win10马上不能用了?那就改装“它”,比win7还稳定流畅...
- Sql Server 的sa用户被禁用
- 今日你以老师为荣,明日老师以你为荣!
- 身份证前6位编码与地址对应关系表
- 结构体定义的几种方式
- 搜索自己博客中的文章
- linux 打开关闭CPU超线程和查看逻辑CPU的个数
- 大家好,我是练习时长两年半的LeetCode爱好者,喜欢唱跳rap
- html5仿ios底部菜单栏,仿苹果电脑任务栏菜单
- Android 屏蔽Menu键