C#单例模式与多线程用法介绍

C#单例模式与多线程用法介绍

单例模式是C#编程中最常用的面向对象设计模式之一,在多线程环境下实现单例模式要注意线程安全问题。本文将从以下几个方面进行介绍:

  • 单例模式的概念及说明
  • 单例模式的实现方式
  • 多线程环境下的单例模式实现
  • 示例代码介绍

单例模式概述

单例模式是指一个类只能被实例化一次,通过提供全局唯一的访问点,来确保该类的对象只有一个。单例模式在多线程环境下应用很广泛,因为多线程环境下创建多个实例可能会影响程序的稳定性和性能。

单例模式实现方式

在C#中实现单例模式有多种方式,这里介绍较为常用的两种实现方式。

方式一:饿汉模式

饿汉模式指的是在程序启动的时候就创建对象。这样做的好处是保证了对象的唯一性和线程安全,但也有一个缺点,就是如果对象很大或者创建起来很耗时,会导致程序启动时间变长。

示例代码如下:

public class Singleton  
{  
    private static Singleton instance = new Singleton();  
    private Singleton(){}  
    public static Singleton GetInstance()  
    {  
        return instance;  
    }  
} 

方式二:懒汉模式

懒汉模式指的是在第一次访问的时候才创建对象。这种方式看起来更加灵活,但也有一个问题,就是在多线程环境下可能会导致创建多个实例的情况。为了避免这种情况,我们可以通过加锁或使用静态构造函数实现线程安全。

示例代码如下:

public class Singleton  
{  
    private static Singleton instance = null;  
    private static readonly object obj = new object();  
    private Singleton(){}  
    public static Singleton GetInstance()  
    {  
        if(instance == null)  
        {  
            lock(obj)  
            {  
                if(instance == null)  
                {  
                    instance = new Singleton();  
                }  
            }  
        }  
        return instance;  
    }  
} 

多线程环境下的单例模式实现

多线程环境下实现单例模式需要注意线程安全问题。常见的做法有使用静态构造函数或者加锁,这里以使用静态构造函数为例进行介绍。

示例代码如下:

public class Singleton  
{  
    private static Singleton instance = null;  
    private static readonly object obj = new object();  
    private Singleton(){}  
    static Singleton()  
    {  
        instance = new Singleton();  
    }  
    public static Singleton GetInstance()  
    {  
        return instance;  
    }  
} 

在上面的示例代码中,使用了静态构造函数来保证线程安全。因为在类第一次被使用时,CLR会自动调用静态构造函数,只有一个线程会执行这个构造函数。

示例代码介绍

下面通过两个示例代码来说明单例模式的应用场景和使用方法。

示例一:Windows窗口

我们知道,在Windows操作系统中,每个窗口都有一个句柄,用于标识这个窗口。为了避免同一个窗口有多个句柄,Windows采用了单例模式来管理窗口的句柄。

示例代码如下:

public class Window  
{  
    private static readonly object obj = new object();  
    private static Window instance = null;  
    private int handle;  
    private Window()  
    {  
        handle = GetWindowHandle();  
    }  
    public static Window GetInstance()  
    {  
        lock(obj)  
        {  
            if(instance == null)  
            {  
                instance = new Window();  
            }  
        }  
        return instance;  
    }  
    private int GetWindowHandle()  
    {  
        // 获取窗口句柄的代码  
        return handle;  
    }  
}  

示例二:日志记录器

在程序开发过程中,我们通常需要记录一些日志信息。为了确保日志信息写入的一致性,我们可以使用单例模式来实现日志记录器。

示例代码如下:

public class Logger  
{  
    private static Logger instance = null;  
    private static readonly object obj = new object();  
    private StreamWriter writer = null;  
    private Logger()  
    {  
        string fileName ="log.txt";  
        writer = File.CreateText(fileName);  
    }  
    public static Logger GetInstance()  
    {  
        if(instance == null)  
        {  
            lock(obj)  
            {  
                if(instance == null)  
                {  
                    instance = new Logger();  
                }  
            }  
        }  
        return instance;  
    }  
    public void WriteLog(string message)  
    {  
        writer.WriteLine("{0} - {1}", DateTime.Now.ToString(), message);  
        writer.Flush();  
    }  
} 

以上就是C#单例模式与多线程用法介绍的完整攻略。希望本文能对大家学习和使用单例模式有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C#单例模式与多线程用法介绍 - Python技术站

(0)
上一篇 2023年6月7日
下一篇 2023年6月7日

相关文章

  • ASP.NET Core中如何利用多种方式给Action传参

    在ASP.NET Core中,您可以使用多种方式将参数传递给Action。以下是一些常见的方法: 1. 通过路由参数传递参数 在ASP.NET Core中,您可以通过路由参数将参数传递给Action。以下是一个示例: [Route("products/{id}")] public IActionResult GetProduct(int …

    C# 2023年5月17日
    00
  • C# WCF简单入门图文教程(VS2010版)

    C# WCF简单入门图文教程(VS2010版) WCF(Windows Communication Foundation)是一个用于构建分布式应用程序的框架。它提供了一种统一的编程模型,使得开发人员可以使用不同的传输协议和编码方式来实现分布式应用程序。本文将详细讲解如何使用C# WCF进行简单入门,并提供两个示例。 1. 创建WCF服务 首先,我们需要创建一…

    C# 2023年5月15日
    00
  • C#简单的特殊输出实例

    接下来我将为您详细讲解使用C#实现特殊输出的方法。 1. 基础知识 在C#中,我们可以使用Console.WriteLine()方法来输出字符串,并使用{}将变量括起来输出变量的值。 例如: int age = 18; Console.WriteLine("My age is {0}", age); 输出结果为:My age is 18 …

    C# 2023年6月6日
    00
  • C# Linq的DefaultIfEmpty()方法 – 返回序列中的元素,如果序列为空则返回指定的默认值

    下面是详细讲解C# Linq的DefaultIfEmpty()的完整攻略。 DefaultIfEmpty()方法的作用和定义 DefaultIfEmpty()是C# Linq扩展方法之一,该方法用于获取一个序列的副本,如果序列为空,则返回一个包含默认值的序列。 其基本语法如下: public static System.Linq.IEnumerable&lt…

    C# 2023年4月19日
    00
  • C#实现单例模式的6种方法小结

    C#实现单例模式的6种方法小结 什么是单例模式? 单例模式是一种软件设计模式,它限制了某个类只能有一个实例,并且该实例可以从全局访问。单例模式通常用于控制资源的共享,并且可以避免竞态条件(race condition)。 单例模式的优点 单例模式可以保证某个类在全局范围内只有一个对象实例,这可以减少系统中的内存占用和资源消耗 单例模式可以确保某些操作只会被执…

    C# 2023年5月15日
    00
  • asp.net Core中同名服务注册的实现代码

    ASP.NET Core是一个跨平台的Web应用程序框架,可以在Windows、Linux和macOS上运行。在ASP.NET Core中,同名服务注册是指向服务容器注册两个或多个具有相同服务名称的服务实例。下面是实现同名服务注册的代码攻略。 1. 同名服务注册的实现方式 实现同名服务注册可以使用IServiceCollection接口的Add方法。Add方…

    C# 2023年5月31日
    00
  • SQL Server 2005 中使用 Try Catch 处理异常

    下面是详细讲解 SQL Server 2005 中使用 TryCatch 处理异常的完整攻略。 什么是 TryCatch TryCatch 是一种异常处理机制,可以在代码执行过程中捕获异常,并采取不同的措施对它们进行处理。在 SQL Server 中,TryCatch 可以用来处理 T-SQL 脚本中的异常。 使用 TryCatch 处理异常的基本格式 在 …

    C# 2023年5月15日
    00
  • asp.net core3.1 引用的元包dll版本兼容性问题解决方案

    asp.net core3.1 引用的元包dll版本兼容性问题解决方案 在使用ASP.NET Core 3.1开发应用程序时,可能会遇到引用的元包DLL版本不兼容的问题。这通常是由于不同的元包使用了不同的依赖项版本所致。在本攻略中,我们将详细讲解如何解决ASP.NET Core 3.1引用的元包DLL版本兼容性问题,并提供两个示例说明。 步骤一:使用NuGe…

    C# 2023年5月17日
    00
合作推广
合作推广
分享本页
返回顶部