设计模式----单例模式实例
单例模式通常分懒汉和饿汉两种模式。
1、懒汉单例模式
可以理解为懒汉模式创建的类,非常懒,只有在被调用时才会判断自身是否已有对象,如果没有就立即创建自身对象,然后返回。如果已有对象就立即返回。
public Class Single{private static Single intance = null;private Single(){};//私有默认构造器public static synchronized Single getIntence(){//添加同步锁,防止多线程同时进入造成多次实例化if(intence==null){intance = new Single();}return intance;}
}
优点:调用时才会初始化,避免资源浪费。
缺点:加了synchronized锁,影响效率 。
2、饿汉单例模式
可以理解为饿汉模式创建的类都很饥渴,在类加载的时候就创建对象。
public Class Single{private static Single intance = new Single();//当类加载时就调用自身private Single(){};public static Single getIntance(){return intance;}
}
优点:1、线程安全,在类加载时创建实例不存在在运行过程中,多个线程创建多次实例,避免了多线程同步的情况。
2、调用时速度快。
缺点:资源效率不高,如果之后没有用到getinstance()的话,会造成资源浪费。
下面介绍几种单例模式为常用细分类:
1、懒汉模式不安全(lazy loading)
严格意义上不是单例模式,这种模式不能在多线程环境下使用。
public Class Single{private static Single instance;private Single();public static Single getInstance(){ //未加安全锁,大家一起用if(instance == null){instance = new Single();}return instance;}
}
很明显这种方式不适合在多线程下使用。
下面这几种都适合多线程使用。
2、双重检验锁/双检锁
他是懒汉的一种,这种方式采用了双锁机制,在安全下保持高性能。
public Class Single{private static Single instance;private Single();public static Single getInstance(){if(instance == null){synchronized(Single.class);if(instance == null){instance = new Single();}}}}
可在实例域需要延迟初始化的时候使用。
3、登记式/静态内部类
对静态域进行延迟初始化应用这种方式而不用双检锁。
public Class Single{private static class SingleHandler{private static final Single instance = new Single();}private Single(){};public static final Single getInstance(){return SingleHandler().instance;}
}
这种方式就是Single类被加载后,instance不一定被实例化。如果实例化 instance 很消耗资源,所以想让它延迟加载,另外一方面,又不希望在 Singleton 类加载时就实例化,因为不能确保 Singleton 类还可能在其他的地方被主动使用从而被加载,那么这个时候实例化 instance 显然是不合适的。
4、枚举
这种方式是 Effective Java 作者 Josh Bloch 提倡的方式,它不仅能避免多线程同步问题,而且还自动支持序列化机制,防止反序列化重新创建新的对象,绝对防止多次实例化。他不具有懒汉的特性。由于 JDK1.5 之后才加入 enum 特性,在实际工作中,很少用。
不能通过 reflection attack 来调用私有构造方法。
public enum Single(){instance;public void method(){}
}
总结
通常,不建议使用懒汉模式不安全和synchronizad懒汉方式,建议使用饿汉方式。只有在要明确实现 lazy loading 效果时,才会使用登记式。如果涉及到反序列化创建对象时,可以尝试使用枚举方式。如果有其他特殊的需求,可以考虑使用双检锁方式。
设计模式----单例模式实例相关推荐
- Python设计模式-单例模式
Python设计模式-单例模式 基于Python3.5.2,代码如下 #coding:utf-8 import threading import timeclass Singleton(object) ...
- Android设计模式——单例模式(Singleton)
二十三种设计模式分为三大类: 创建型模式,共五种:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式. 结构型模式,共七种:适配器模式.装饰器模式.代理模式.外观模式.桥接模式.组合模式.享元 ...
- 【学习笔记】ABAP OOD设计模式 - 单例模式
ABAP OOD设计模式 - 单例模式 整理转自-<SAP ABAP 面向对象程序设计(原则.模式及实践)> 单例模式(Singleton Pattern)是常用的且较为简单的软件设计模式 ...
- Go 语言实现 23 种设计模式 单例模式
Go 语言实现 23 种设计模式 单例模式 单例模式 单例模式是一种常用的软件设计模式,在使用过程中,单例对象的类只有一个实例.使用单例模式,1 可以节省内存等资源,例如windows操作系统的资源管 ...
- java singleton inner class_Java面向对象设计模式-单例模式
Java面向对象设计模式-单例模式 2020-05-28 589 0 单例模式保证一个类仅有一个实例,并提供一个访问它的全局访问点,有多重实现方式. 一.饿汉式单例模式,构造方法私有化,在加载类Sin ...
- Java开发中常用的设计模式-单例模式
单例(Singleton)模式的定义:指一个类只有一个实例,且该类能自行创建这个实例的一种模式. Java开发中常用的设计模式-单例模式 单例模式有3个特点: 单例类只有一个实例对象: 该单例对象必须 ...
- 炒冷饭系列:设计模式 单例模式
2019独角兽企业重金招聘Python工程师标准>>> 炒冷饭系列:设计模式 单例模式 摘要: 原创出处: http://www.cnblogs.com/Alandre/ 泥沙砖瓦浆 ...
- 设计模式-单例模式-注册式单例模式-枚举式单例模式和容器式单例模式在Java中的使用示例
场景 设计模式-单例模式-饿汉式单例模式.懒汉式单例模式.静态内部类在Java中的使用示例: 设计模式-单例模式-饿汉式单例模式.懒汉式单例模式.静态内部类在Java中的使用示例_霸道流氓气质的博客- ...
- 设计模式----创建型设计模式(单例模式、工厂方法模式、构建者模式)
创建型设计模式 单例模式(Singleton Pattern) 单例模式介绍 代码演示 饿汉式(静态常量) 饿汉式(静态代码块) 懒汉式(线程不安全) 懒汉式(线程安全,同步方法) 懒汉式(线程安全, ...
最新文章
- 哪个版本好_《道德经》道尽人生大智慧,哪个版本《道德经》的注释比较好呢?...
- python 购物车代码
- Docker入门-搭建docker私有仓库
- SpringBoot高级-检索-Elasticsearch简介安装
- springboot定时备份MYSQL_spring boot 定时备份数据库
- 利用CSS3实现鼠标悬停在图片上图片缓慢缩放的两种方法
- linux monitor工具,5 款 Ubuntu 系统监控工具
- 卧槽!全网最全编程学习网站汇总!还不赶快放到收藏夹里吃灰~
- 什么是人工智能?人工智能如何系统的学习
- matlab飞机大战小游戏(第二版)
- 边云协同的优点_探析云边协同的九大应用场景
- 【Java】使用PDF模板合成PDF文件(文本 + 图片)
- 图说三极管,太容易懂了!(史上最详细版本)
- 大数据_07 【hadoop HDFS的shell命令操作】
- 数据库系统概论(第十章: 数据库恢复技术)
- Linux——软件安装
- 第三方推送(小米华为友盟)接入实践
- A Blockchain-based Decentralized Federated Learning Framework wth Committee Consensus
- 【转】学习如何学习的算法:简述元学习研究方向现状
- 设计模式七:结构型-适配器模式
热门文章
- 【放置奇兵】算法 PVE总结
- 单目标识别下的以中心点定位为目标值的yolo改进算法措施
- python numpy np.argsort()(返回将对数组进行排序的索引)(不懂区别?)
- 哈尔滨工业大学-数据库系统(基本知识与关系模型1)
- excel行列互换_Excel如何实现行列数据互换?其实除了复制粘贴,还能这样操作...
- 个人所有博客分类总结(持续更新)
- Java获取近七天的数据条数,及页面实现折线图(附前后端代码)
- JdbcTemplate中的query方法(代码)
- 动态添加 ajax,ajax动态的添加内容【原创】
- 组播应用场景_推介4K IP切换系统在5G媒体集成制作中的应用