设计模式GOF23之单例模式
单例模式的五种方式
主要:懒汉式,饿汉式
其他:双重检测锁(Double Checking模式),静态内部类,枚举模式
选取时机
延时加载,占用内部资源大:静态内部类好于懒汉
不延时加载,占用内部资源小:枚举好于饿汉
/**
* 单例模式 懒汉式
* @author 小帆敲代码
*
*/
public class Demo01 {
//类加载时,不初始化(可以延时加载)
private static Demo01 instance;
private Demo01(){
}
//上锁,并发效率低
public static synchronized Demo01 getInstance() {
if(instance==null) {
instance=new Demo01();
}
return instance;
}
}
/**
* 单例模式 饿汉式
* @author 小帆敲代码
*
*/
public class Demo02 {
//类加载时,对象就被初始化(不可以延时加载),天然的线程安全,并发效率高
private static Demo02 instance=new Demo02();
private Demo02(){
}
//不上锁,并发效率高
public static Demo02 getInstance() {
return instance;
}
}
/**
* 双重检测 Double checking
* 问题 指令重排和JVM内部模型不支持可能会带来问题
* 解决方法:volatile取消指令重排
* @author 小帆敲代码
*
*/
public class Demo03 {
private /* volatile*/ static Demo03 instance=null;
private Demo03() {
}
public static Demo03 getInstance() {
//double checking
if(null==instance) {
//只在第一次创建时锁
synchronized(Demo03.class) {
if(null==instance)
instance=new Demo03();
}
}
return instance;
}
}
/**
* 静态内部类实现单例模式
* 线程安全,效率高,延迟加载
* @author 小帆敲代码
*
*/
public class Demo04 {
//外部类没有static属性,只有在被使用时才会被加载内部类
private static class SingleDemo04{
private static /*final*/ Demo04 instance=new Demo04();
}
private Demo04() {
}
public static Demo04 getInstance() {
return new SingleDemo04().instance;
}
}
/**
* 枚举模式实现单例
* 保证只有一个,线程安全,天然的防止反射和反序列化的漏洞
* 不能延时加载
* @author 小帆敲代码
*
*/
public enum Demo05 {
//只有一个实例
INSTANCE;
//其他操作
public void dosomething() {
}
}
设计模式GOF23之单例模式的更多相关文章
- 【白话设计模式四】单例模式(Singleton)
转自:https://my.oschina.net/xianggao/blog/616385 0 系列目录 白话设计模式 工厂模式 单例模式 [白话设计模式一]简单工厂模式(Simple Factor ...
- php设计模式笔记:单例模式
php设计模式笔记:单例模式 意图: 保证一个类仅有一个实例,并且提供一个全局访问点 单例模式有三个特点: 1.一个类只有一个实例2.它必须自行创建这个实例3.必须自行向整个系统提供这个实例 主要实现 ...
- Java设计模式之《单例模式》及应用场景
摘要: 原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/6510196.html 所谓单例,指的就是单实例,有且仅有一个类实例,这个单例不应该 ...
- Java设计模式之【单例模式】
Java设计模式之[单例模式] 何为单例 在应用的生存周期中,一个类的实例有且仅有一个 当在一些业务中需要规定某个类的实例有且仅有一个时,就可以用单例模式 比如spring容器默认初始化的实例就是单例 ...
- Java设计模式中的单例模式
有时候在实际项目的开发中,我们会碰到这样一种情况,该类只允许存在一个实例化的对象,不允许存在一个以上的实例化对象,我们将这种情况称为Java设计模式中的单例模式.设计单例模式主要采用了Java的pri ...
- C#设计模式学习笔记-单例模式随笔
最近学习 设计模式,从单例模式入手 啥是单例模式: 要实现一个单例类的话,首先,肯定是不能让用户自行生产的,那就是说明不能让用户new,所以,就必须把构造函数设置成为私有的 因为静态变量的生命周期跟整 ...
- IOS设计模式浅析之单例模式(Singleton)
说在前面 进入正式的设计模式交流之前,扯点闲话.我们在项目开发的过程中,经常会不经意的使用一些常见的设计模式,如单例模式.工厂方法模式.观察者模式等,以前做.NET开发的时候,认真拜读了一下程杰老师的 ...
- C#设计模式学习笔记-单例模式(转)
C#设计模式学习笔记-单例模式 http://www.cnblogs.com/xun126/archive/2011/03/09/1970807.html 最近在学设计模式,学到创建型模式的时候,碰到 ...
- PHP 面向对象编程和设计模式 (3/5) - 单例模式和工厂模式
PHP高级程序设计 学习笔记 2014.06.11 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可重用代码.让代码更容 ...
随机推荐
- 微服务统计,分析,图表,监控, 分布式追踪一体化的 HttpReports 在 .Net Core 的应用
前言介绍 HttpReports 是针对.Net Core 开发的轻量级APM系统,基于MIT开源协议, 使用HttpReports可以快速搭建.Net Core环境下统计,分析,图表,监控,分布式追 ...
- 测试需要用到的chrome调试
模拟慢网速 断开网络 F12后勾选上offline 请求304 后来发现是选中了该浏览其的Disable cache,去掉就好了.
- C# LINQ查询之对象
LINQ是一组查询技术的统称,其主要思想是将各种查询功能直接集成到C#语言中,可以对 对象.XML文档.SQL数据库.外部应用程序等进行操作. 这里面讲的简单的几个子句, 必须以from子句开头,以s ...
- Spiking-YOLO : 前沿性研究,脉冲神经网络在目标检测的首次尝试 | AAAI 2020
论文提出Spiking-YOLO,是脉冲神经网络在目标检测领域的首次成功尝试,实现了与卷积神经网络相当的性能,而能源消耗极低.论文内容新颖,比较前沿,推荐给大家阅读 来源:晓飞的算法工程笔记 公众 ...
- thinkphp5 不使用form,用input+ajax异步上传图片
不支持$this->request->file()获取图片 后台接收文件请使用$_FILE 正文开始: HTML <div class="upload"> ...
- Redis持久化存储(二)
redis多实例介绍 接上一篇redis.创建数据存放的目录 vim redis.conf +187 dir /application/data/ 重新启动 mkdir /application/da ...
- js 之 object
js之object 对象 ECMA-262 把对象(object)定义为“属性的无序集合,每个属性存放一个原始值.对象或函数”.严格来说,这意味着对象是无特定顺序的值的数组. 尽管 ECMAScrip ...
- js之用IndexOf返回指定字符串的次数
代码 var Str = "strs,strs,stras,str,strs,strs"; var subStr ="strs" ; var count = 0 ...
- Git初始化本地代码及提交到服务器
2019独角兽企业重金招聘Python工程师标准>>> 1.先安装Git客户端 2.进入需要提交的文件夹目录 3.打开Git Bash,点击右键中的Git Bash 打开git命令窗 ...
- 虚拟化学习笔记-KVM虚拟化跨机迁移原理
参考:https://zhuanlan.zhihu.com/p/27055555 在线迁移过程划分为三个阶段:准备阶段.迁移阶段和切换阶段.迁移环境为虚拟化底层KVM+Qemu.虚拟化管理Libvir ...