C#浅析单例模式

第一次写博客,写的不好休怪哈。

版本1:最简单的单例模式

方法一:

public class MySingleton
    {
        private MySingleton()  //构造函数,注意private
        {
        }
        private static MySingleton _Entity = null;  //私有字段

        public static MySingleton Entity  //公共属性
        {
            get
            {
                if (_Entity == null)  //确保只能创建一次对象
                {
                    MySingleton._Entity = new MySingleton();
                }
                return MySingleton._Entity;
            }
        }
    }

方法二:

public class MySingleton
    {
        private MySingleton()  //构造函数,注意private
        {
        }
        private static MySingleton _Entity = null;  //私有字段

        public static MySingleton GetEntity()  //公有方法
        {
            if (_Entity == null)  //确保只能创建一次对象
            {
                MySingleton._Entity = new MySingleton();
            }
            return MySingleton._Entity;
        }
    }

两点:1)保证所有构造函数不被外部所调用;2)利用属性或者方法调用对象。

缺点:无法保证线程的安全性,多个线程的情况下可能创建多个对象。

版本2:线程安全的单例模式

 public class MySingleton
    {
        private MySingleton()  //构造函数,注意private
        {
        }

        private static readonly object obj = new object();
        private static MySingleton _Entity = null;  //私有字段

        public static MySingleton Entity  //公共属性
        {
            get
            {
                lock (obj)  //确保同一时刻,加锁的代码段只能被一个线程执行
                {
                    if (_Entity == null)  //确保只能创建一次对象
                    {
                        MySingleton._Entity = new MySingleton();
                    }
                }
                return MySingleton._Entity;
            }
        }
    }

缺点:无论对象是否已经被创建,都要进行加锁,增加了不必要的开销。

版本3:Double-Checked Locking

public class MySingleton
    {
        private MySingleton()  //构造函数,注意private
        {
        }

        private static readonly object obj = new object();
        private static MySingleton _Entity = null;  //私有字段

        public static MySingleton Entity  //公共属性
        {
            get
            {
                if (_Entity == null)  //第一次检验,用于减少不必要的加锁
                {
                    lock (obj)  //确保同一时刻,加锁的代码段只能被一个线程执行
                    {
                        if (_Entity == null)  //第二次检验,确保只能创建一次对象
                        {
                            MySingleton._Entity = new MySingleton();
                        }
                    }
                }
                return MySingleton._Entity;
            }
        }
    }

这种方法既保证了线程的安全,又减少了加锁带来的不必要的开销。

时间: 2024-10-09 22:07:21

C#浅析单例模式的相关文章

浅析单例模式

单例模式是设计模式中最简单的形式之一.这一模式的目的是使得类的一个对象成为系统中的唯一实例. 单例代码如下: private static JobManager _instance;        private static Object padlock = new Object();        public static JobManager Instance        {            get            {                if (_instanc

浅析单例模式与线程安全(Linux环境c++版本)

什么是单例模式 单例模式是设计模式中一种常用模式,定义是Ensure a class has only one instance, and provide a global point of access to it.(确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例) 用<设计模式之禅>里的话说,就是,在一个系统中,要求一个类有且仅有一个对象,如果出现多个就会出现"不良反应",比如以下情景可能会用到单例模式 要求生成唯一序列号的环境 在整个项目中需要一个共享

单例模式浅析

  单例模式 单例模式是一种比较常见的模式,看起来很简单,但是要做到高效安全的使用,其中还是有很多要点的.参考了Head First及众多网友的文章,稍微总结一下,以备查看. 单例模式的定义:确保一个类只有一个实例,并且提供一个全局访问点. 1. 最简单的单例(饿汉模式),程序一加载就对 instance 变量进行初始化,好处是简单明了,缺点:如果初始化的耗费的资源特别多,而之后这个类可能未被使用到,就会造成浪费. public class Singleton{ // 单例类静态引用 priva

浅析java单例模式

单例模式:运行期间有且仅有一个实例 一. 关键点: 1.一个类只有一个实例------最基本的-----(只提供私有构造器) 2.该类必须自行创建这个实例-----(定义了静态的该类的私有对象) 3.该类必须自行向整个系统提供这个实例---(提供一个静态的公有方法,返回创建或者获取本身的静    态私有对象) 二.基本单例模式 1.懒汉模式 懒汉模式:在类加载的时候,不创建实例,运行调用的时候创建(以时间换空间) 优缺点:类加载快,在运行时获取速度慢:线程不安全: 解决懒汉模式线程安全方法:(1

浅析JAVA设计模式之单例模式(一)

1 单例模式简介 单例模式确保一个类只有一个实例,并且自行实行实例化并向整个系统提供这个实例. 单例模式有三个要点: 1.某个类只能有一个实例. 2.它必须自行创建这个实例. 3.它必须向整个系统提供这个实例. 单例模式主要分为两种:饿汉式单例模式和懒汉式单例模式 1.1饿汉式单例模式: 饿汉式单例模式是java语言实现起来最为简单的单例模式,UML图如下: 图1.1 从图中可以看出,它自己将自己实例化. 1.2饿汉式单例模式的实现(建一个Singleton包,所有程序放在该包下): (1)建一

单例模式与线程安全问题浅析

近期看到到Struts1与Struts2的比較.说Struts1的控制器是单例的,线程不安全的:Struts2的多例的,不存在线程不安全的问题.之后又想到了之前自己用过的HttpHandler... 这些类.好像单例的线程安全问题确实是随处可见的. 可是仅仅是知道这个是不安全的,也没有认真分析过.接下来就细致分析下. 一,改动单例模式代码 首先我先写一段单例类的代码: /** * @ClassName: Sigleton * @Description: 单例类 * @author 水田 * @d

浅析Java设计模式 - 单例模式

以下是三种单例模式的代码实现,前两者用的比较多 (言外之意 最后一种可以忽略) 1 package com.signle; 2 3 import java.util.HashMap; 4 import java.util.Map; 5 6 /** 7 * 8 * @title 单例模式 9 * @Copyright Copyright (c)2016年3月9日 10 * @Company CTC 11 * @version 1.0 12 * @author ejokovic 13 * @time

PHP单例模式浅析

首先我们要明确单例模式这个概念,那么什么是单例模式呢?单例模式顾名思义,就是只有一个实例.作为对象的创建模式, 单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例,这个类我们称之为单例类. 单例模式的要点有三个:   它们必须拥有一个构造函数,并且必须被标记为private   它们拥有一个保存类的实例的静态成员变量   它们拥有一个访问这个实例的公共的静态方法 和普通类不同的是,单例类不能在其他类中直接实例化.单例类只能被其自身实例化.要获得这样的一种结果, __cons

浅析Javascript单例模式

定义 保证一个类仅有一个实例,并提供一个访问它的全局访问点 .就想我们在开发中有些对象只需要一个,例如window对象. 1. 实现单例模式 var Singleton = function( name ) { this.name = name; }; Singleton.prototype.getName = function() { alert ( this.name ); }; Singleton.getInstance = function( name ) { if ( !this.in