C# 单例类
单例类
有时候我们不要在一个程序中创建太多的实例。只想用一个全局的实例和一个可以访问点。那么我们需要一个单例类。
因为是单例类啦,所以构造函数肯定是私有的。
需要了解的术语
懒汉式
顾名思义。什么时候用就什么时候去new实例。
比如:
class Singleton
{
private static Singleton instance = null; private Singleton()
{ } public static Singleton Instance
{
get
{
if(instance == null)
{
instance = new Singleton();
} return instance;
}
}
}
饿汉式
还没用就已经有实例对象
比如把上面的代码改一改:
class Singleton
{
private Singleton()
{ } public static Singleton Instance { get; } = new Singleton();
}
不过同样,这样就不知道到底是时候构造的。
线程不安全/安全
毕竟new一个对象是个动态的过程。步骤还是有点的。如果多个线程访问同一个实例。由于存在共享变量。可能会造成前一个还没好,后面一个有进来的情况。最后有多少线程,就创建多少实例。这样就称为线程不安全。
相反,如果对同一个类不会造成影响。那么就是安全的。
第一个代码片段是不安全的。第二个代码片段是安全的(在线程还没出现之前就已经实例化了,因此饿汉式线程一定是安全的)。
懒汉式 线程安全
因为我们还是怕共享变量的。所以加锁了。
class Singleton
{
private static Singleton instance;
private readonly static object lockobj = new object();
private Singleton()
{ } public static Singleton Instance
{
get
{
lock (lockobj)
{
if (instance == null)
{
instance = new Singleton();
}
} return instance;
}
}
}
但每次都加锁,肯定很慢的啦。于是,打算只有第一次创建的时候加锁。
class Singleton
{
private static Singleton instance;
private readonly static object lockobj = new object();
private Singleton()
{ } public static Singleton Instance
{
get
{
if(instance == null)
{
lock (lockobj)
{
if (instance == null)
{
instance = new Singleton();
}
}
} return instance;
}
}
}
如果还是怕不知道什么时候构建。可以使用内部类。保证一下
public class Singleton
{
class Nested
{
internal static readonly Singleton instance = new Singleton();
}
private Singleton() { }
public static Singleton Instance { get { return Nested.instance; } }
}
实现单例基类
最后一个是看别人的。
public abstract class Singleton<T> where T : class
{
class Nested
{
// 创建模板类实例,参数2设为true表示支持私有构造函数
internal static readonly T instance = Activator.CreateInstance(typeof(T), true) as T;
}
private static T instance = null;
public static T Instance { get { return Nested.instance; } }
} class TestSingleton : Singleton<TestSingleton>
{
// 将构造函数私有化,防止外部通过new创建
private TestSingleton() { }
}
C# 单例类的更多相关文章
- java单例类/
java单例类 一个类只能创建一个实例,那么这个类就是一个单例类 可以重写toString方法 输出想要输出的内容 可以重写equcal来比较想要比较的内容是否相等 对于final修饰的成员变量 一 ...
- iOS中编写单例类的心得
单例 1.认识过的单例类有哪些: NSUserDefaults.NSNotificationCenter.NSFileManager.UIApplication 2.单例类 单例类某个类在代码编写时使 ...
- 如何防止JAVA反射对单例类的攻击?
在我的上篇随笔中,我们知道了创建单例类有以下几种方式: (1).饿汉式; (2).懒汉式(.加同步锁的懒汉式.加双重校验锁的懒汉式.防止指令重排优化的懒汉式); (3).登记式单例模式; (4).静态 ...
- 0013 Java学习笔记-面向对象-static、静态变量、静态方法、静态块、单例类
static可以修饰哪些成员 成员变量---可以修饰 构造方法---不可以 方法---可以修饰 初始化块---可以修饰 内部类(包括接口.枚举)---可以修饰 总的来说:静态成员不能访问非静态成员 静 ...
- 设计模式(java) 单例模式 单例类
·单例类 单实例类,就是这个类只能创建一个对象,保证了对象实例的唯一性. 1.单例模式( Singleton Pattern) 是一个比较简单的模式, 其定义如下:Ensure a class has ...
- [转]单例模式——C++实现自动释放单例类的实例
[转]单例模式——C++实现自动释放单例类的实例 http://www.cnblogs.com/wxxweb/archive/2011/04/15/2017088.html http://blog.s ...
- iOS - OC SingleClass 单例类
前言 单例对象能够被整个程序所操作.对于一个单例类,无论初始化单例对象多少次,也只能有一个单例对象存在,并且该对象是全局的,能够被整个系统访问到. 特点: 在内存中只有一个实例 提供一个全局的访问点 ...
- iOS - Swift SingleClass 单例类
前言 单例对象能够被整个程序所操作.对于一个单例类,无论初始化单例对象多少次,也只能有一个单例对象存在,并且该对象是全局的,能够被整个系统访问到. 单例类的创建 1.1 单例类的创建 1 单例类的创建 ...
- Java单例类的简单实现
对于java新手来说,单例类给我的印象挺深,之前一道web后台笔试题就是写单例类.*.*可惜当时不了解. 在大部分时候,我们将类的构造器定义成public访问权限,允许任何类自由创建该类的对象.但在某 ...
- (七)boost库之单例类
(七)boost库之单例类 一.boost.serialzation的单件实现 单例模式是一种常用的软件设计模式.在它的核心结构中只包含一个被称为单例类的特殊类.通过单例模式可以保证系统中一个类只有一 ...
随机推荐
- VisualTreeHelper使用——使用BFS实现高效率的视觉对象搜索
BFS,即广度优先搜索,是一种典型的图论算法.BFS算法与DFS(深度优先搜索)算法相对应,都是寻找图论中寻路的常用算法,两者的实现各有优点. 其中DFS算法常用递归实现,也就是常见的一条路找到黑再找 ...
- 【水滴石穿】react-native忽略黄色提醒
方法一 import { YellowBox } from 'react-native'; YellowBox.ignoreWarnings(['Remote debugger']); // 忽略黄色 ...
- JQuery--jQquery控制CSS样式
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- nginx与apache
参考链接:https://www.cnblogs.com/changning0822/p/7844004.html
- JasperStudio study..
https://blog.csdn.net/shiyun123zw/article/details/79166448
- js(jquery)鼠标移入移出事件时,出现闪烁、隐藏显示隐藏显示不停切换的情况
<script> $(".guanzhu").hover(function(){ $(".weixinTop").show(); },functio ...
- iphone开发中使用nib(xib)文件的内存管理
iphoneuinavigationcontrollercocoauiviewvariableswindows 在使用nib文件做界面开发的过程中,加载nib文件后,由于设置了outlet和deleg ...
- 【转载】Ubuntu终端常用的快捷键
Ubuntu中的许多操作在终端(Terminal)中十分的快捷,记住一些快捷键的操作更得心应手.在Ubuntu中打开终端的快捷键是Ctrl+Alt+T.其他的一些常用的快捷键如下: 快捷键 功能 Ta ...
- LeetCode93 Restore IP Addresses
题目: Given a string containing only digits, restore it by returning all possible valid IP address com ...
- ros 工作空间下cpp文件调用其他cpp文件的函数或变量
最近在学习ros节点编程,在工作空间下添加如下文件: message.h #ifndef MESSAGE_H #define MESSAGE_H extern int n; void init_ros ...