C#设计模式——单例模式的实现
1. 什么是单例
保证一个类只有一个实例的实现方法。
2. 使用场景
页面访问计数器
需要保持状态的工具类
需求很多,不能一一列举了
3. 实现方
非线程安全
1 /// <summary>
2 /// 单例模式的实现
3 /// </summary>
4 public sealed class Singleton
5 {
6 //定义一个静态变量来保存类的实例
7 private static Singleton _instance = null;
8
9 //定义私有构造函数,使外界不能创建该类实例
10 private Singleton()
11 {
12 }
13 /// <summary>
14 /// 定义公有方法提供一个全局访问点,同时你也可以定义公有属性来提供全局访问点
15 /// </summary>
16 /// <returns></returns>
17 public static Singleton Instance()
18 {
19 //如果类的实例不存在则创建,否则直接返回
20 if (_instance == null)
21 {
22 _instance = new Singleton();
23 }
24 return _instance;
25 }
26 }
上面的单例模式的实现在单线程下确实是可以的,但是在多线程环境下会存在两个线程同时执行if (instance == null)并且创建两个不同的实例
简单线程安全
1 /// <summary>
2 /// 单例模式的实现
3 /// </summary>
4 public sealed class Singleton
5 {
6 // 定义一个静态变量来保存类的实例
7 private static Singleton instance = null;
8
9 // 定义一个标识确保线程同步
10 private static readonly object padlock = new object();
11
12 Singleton()
13 {
14 }
15
16 public static Singleton Instance()
17 {
18 // 当第一个线程运行到这里时,此时会对locker对象 "加锁",
19 // 当第二个线程运行该方法时,首先检测到locker对象为"加锁"状态,该线程就会挂起等待第一个线程解锁
20 // lock语句运行完之后(即线程运行完之后)会对该对象"解锁"
21 lock (padlock)
22 {
23 // 如果类的实例不存在则创建,否则直接返回
24 if (instance == null)
25 {
26 instance = new Singleton();
27 }
28 }
29 return instance;
30 }
31 }
上面的例子解决了多线程的问题,但是每个线程调用Instance()都会使用到锁,而调用锁的开销较大,这个实现会有一定的性能损失。
双重验证线程安全
1 /// <summary>
2 /// 单例模式的实现
3 /// </summary>
4 public sealed class Singleton
5 {
6 // 定义一个静态变量来保存类的实例
7 private static Singleton instance = null;
8
9 // 定义一个标识确保线程同步
10 private static readonly object padlock = new object();
11
12 Singleton()
13 {
14 }
15
16 public static Singleton Instance()
17 {
18 // 当第一个线程运行到这里时,此时会对locker对象 "加锁",
19 // 当第二个线程运行该方法时,首先检测到locker对象为"加锁"状态,该线程就会挂起等待第一个线程解锁
20 // lock语句运行完之后(即线程运行完之后)会对该对象"解锁"
21 if (instance == null)
22 {
23 lock (padlock)
24 {
25 // 如果类的实例不存在则创建,否则直接返回
26 if (instance == null)
27 {
28 instance = new Singleton();
29 }
30 }
31 }
32 return instance;
33 }
34 }
上面的例子在保证线程安全的同时提高了性能
静态变量实现单例
1 /// <summary>
2 /// 单例模式的实现
3 /// </summary>
4 public sealed class Singleton
5 {
6 //在Singleton第一次被调用时会执行instance的初始化
7 private static readonly Singleton instance = new Singleton();
8
9 private Singleton()
10 {
11 }
12
13 public static Singleton Instance()
14 {
15 return instance;
16 }
17 }
上面的例子利用.net的特性来完成单例模式的创建,也是线程安全的
4. 优点
在内存中只有一个对象,节省内存空间;
避免频繁的创建销毁对象,可以提高性能;
避免对共享资源的多重占用,简化访问;
为整个系统提供一个全局访问点。
C#设计模式——单例模式的实现的更多相关文章
- 设计模式 单例模式(Singleton) [ 转载2 ]
设计模式 单例模式(Singleton) [ 转载2 ] @author java_my_life 单例模式的结构 单例模式的特点: 单例类只能有一个实例. 单例类必须自己创建自己的唯一实例. 单例类 ...
- 设计模式 单例模式(Singleton) [ 转载 ]
设计模式 单例模式(Singleton) [ 转载 ] 转载请注明出处:http://cantellow.iteye.com/blog/838473 前言 懒汉:调用时才创建对象 饿汉:类初始化时就创 ...
- c#设计模式-单例模式(面试题)
c#设计模式-单例模式 单例模式三种写法: 第一种最简单,但没有考虑线程安全,在多线程时可能会出问题, public class Singleton { private static Singleto ...
- java设计模式单例模式 ----懒汉式与饿汉式的区别
常用的五种单例模式实现方式 ——主要: 1.饿汉式(线程安全,调用率高,但是,不能延迟加载.) 2.懒汉式(线程安全,调用效率不高,可以延时加载.) ——其他: 1.双重检测锁式(由于JVM底层内部模 ...
- 最简单的设计模式——单例模式的演进和推荐写法(Java 版)
前言 如下是之前总结的 C++ 版的:软件开发常用设计模式—单例模式总结(c++版),对比发现 Java 实现的单例模式和 C++ 的在线程安全上还是有些区别的. 概念不多说,没意思,我自己总结就是: ...
- ES6教程-字符串,函数的参数,了解函数的arguments对象,js面向对象,设计模式-单例模式,解构赋值
前言 主要讲解了ES6对字符串的拓展,包括includes,startsWith和endsWith,另外增加了字符串模板. Start includes()是否包含 startsWith()以什么开头 ...
- Java设计模式の单例模式
-------------------------------------------------- 目录 1.定义 2.常见的集中单例实现 a.饿汉式,线程安全 但效率比较低 b.单例模式的实现:饱 ...
- java设计模式——单例模式(一)
一. 定义与类型 定义:保证一个类仅有一个实例,并提供一个全局访问点 类型:创建型 二. 适用场景 想确保任何情况下都绝对只用一个实例 三. 优缺点 优点: 在内存里只有一个实例,减少了内存开销 可以 ...
- php实现设计模式————单例模式
php实现设计模式————单例模式 什么是单例模式 为什么要使用单例模式 php中有哪些方式实现新建一个对象实例 如何阻止这种实例化实现理想的单例模式 代码实现 什么是单例模式 为什么要使用单例模式 ...
- JAVA设计模式-单例模式(Singleton)线程安全与效率
一,前言 单例模式详细大家都已经非常熟悉了,在文章单例模式的八种写法比较中,对单例模式的概念以及使用场景都做了很不错的说明.请在阅读本文之前,阅读一下这篇文章,因为本文就是按照这篇文章中的八种单例模式 ...
随机推荐
- java.util.concurrent.ExecutionException: com.android.builder.internal.aapt.v2.Aapt2Exception: AAPT2 error: check logs for details
Caused by: java.util.concurrent.ExecutionException: com.android.builder.internal.aapt.v2.Aapt2Except ...
- C#_计算目前时间到指定的周X、指定的时间X 还有多少秒
比如:当前时间到下周二 05:00:00还剩下多少秒? /// <summary> /// 计算距离下一个 周XX XX时XX分XX秒,还剩下多少秒 /// </summary> ...
- python函数注释,参数后面加冒号:,函数后面的箭头→是什么?
https://blog.csdn.net/sunt2018/article/details/83022493
- PHP常用工具类
<?php namespace isslib\Util; use think\Config; /** * 常用工具类 * User: xaxiong * Date: 2016/12/19 * T ...
- 某mac最简单调节亮度
说明 mac用户其实都可以使用 背景 很多人都说需要打补丁啊,或者修改什么的,我试过不管用.不如通过软件调节.. 正文 从appstore下载 Brightness Slider 即可,虽然不能达到系 ...
- mariadb笔记
MariaDB or MySQL DDL:数据定义语言 DML:数据操纵语言 skip_name_resolve = on :跳过域名解析: MariaDB [(none)]> s ...
- 八大排序算法详解(动图演示 思路分析 实例代码java 复杂度分析 适用场景)
一.分类 1.内部排序和外部排序 内部排序:待排序记录存放在计算机随机存储器中(说简单点,就是内存)进行的排序过程. 外部排序:待排序记录的数量很大,以致于内存不能一次容纳全部记录,所以在排序过程中需 ...
- shell脚本学习之实例列举
1.用shell写一个从1加到100的程序: 方法一: #!/bin/bashsum=0for i in {1..100}do let sum+=$idone echo $sum 方法二: # ...
- 如何改变checkbox的样式
<!doctype html> <html> <head> <meta charset="utf-8"> ...
- poj1721
题解: 直接暴力循环节 然后再做几次 代码: #include<cstdio> #include<cstring> #include<algorithm> #inc ...