首页 技术 正文
技术 2022年11月21日
0 收藏 787 点赞 3,174 浏览 1642 个字

一、单例模式简介

单例模式是为保证一个对象,在程序运行的任何时刻只有一个实例存在,我们把这种实现方式称之为“单例模式”。

二、单例模式的核心

单例类只有一个实例存在

单例类提供一个全局访问点

单例类通过自己创建唯一实例

单例类对外所有访问对象都提供一个唯一实例。

三、单例模式的优点

1、在程序运行中只有一个实例,减少内存占用,减少频繁的创建和销毁实例所带来的系统开销,

2、避免资源的多种无效占用

单例模式缺点:

没有接口 不能继承

四、单例模式应用场景

当一个事物在特定的环境中,只会存在一个实例时,我们可以采用单例模式对其进行设计。

例: 数据库连接池,计算机注册表 一个国家只有一个总统 日志系统中的日志文件 计算机中的打印池 计算机设备管理器

生成唯一序列号 网站计数器

五、单例模式的实现方式

1、非线程安全(尽量不要用)

public sealed class Singleton{private static Singleton instance=null;private Singleton(){}public static Singleton Instance{get{if (instance==null){instance = new Singleton();}return instance;}}}

说明:上面的方法是非线程安全的,2个不同的线程可以同时进入这个方法,如果instance为空的并且这里返回真的情况下,都可以创建实例,这显然违反了单例模式,实际上,在测试以前,实例就已经有可能被创建了,

但是内存模型不能保证这个实例能被其他的线程看到,除非合适的内存屏障已经被跨过了。

2、简单的线程安全

public sealed class Singleton{private static Singleton instance = null;private static readonly object padlock = new object();Singleton(){}public static Singleton Instance{get{lock (padlock){if (instance == null){instance = new Singleton();}return instance;}}}}

上述实现是线程安全的。这个线程在共享的object上取出了一把锁,然后在创建实例以前检查这个实例是否被创建了。

这个保护了内存屏障问题(lock保证了所有的读取操作是在LOCK获得以后发生的,所有的unlock保证了所有的写操作在lock 释放以后发生的),这样就保证了一个线程只能创建一个实例(每次只有一个线程在这段代码中运行),不巧的是,性能上来说,锁变成了每次都必须的当这个实例被响应的时候。

3、尝试线程安全(双重锁定)不推荐使用

public sealed class Singleton{private static Singleton instance = null;private static readonly object padlock = new object();Singleton(){}public static Singleton Instance{get{if (instance == null){lock (padlock){if (instance == null){instance = new Singleton();}}}return instance;}}}

4、不完全lazy,但是线程安全且不用用锁 推荐使用

public sealed class Singleton{private static readonly Singleton instance = new Singleton();// 显示的static 构造函数//没必要标记类型 - 在field初始化以前static Singleton(){}private Singleton(){}public static Singleton Instance{get{return instance;}}}

欢迎关注我的公众号(同步更新文章)DoNet技术分享平台

阅读原文

相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:8,958
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,482
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,328
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,111
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:7,743
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:4,777