• 单件模式(Singleton)和锁定(lock)


    利用过年休假的时间,重读《设计模式》一书,做了一些笔记,这是第一篇

    单件模式,或者也可以称为单例模式(singleton)是23种常见模式中最简单的,也是第一个模式。它的目的是保证一个类(class)在应用系统中只有一个实例(instance),为什么要这么做呢?有两个主要原因

    1. 节省内存(因为只有一个实例了,所以内存自然会更节省)
    2. 保存状态,例如要做整个程序级别的计数统计这一类的工作。

    单例模式的做法,主要是将类型的默认构造函数(无参构造器)的访问级别降低(设置为private),这样就无法通过new关键字来创建实例,然后在类型中提供一个静态的方法,即所有的调用都必须通过这个方法来取得实例,这时就自然有办法进行一些控制了。

    既然用一个实例,就多多少少会涉及到资源争用的问题,也就是说多个线程可能在同一个时间需要操作实例中的某些资源。.NET中提供的线程同步技术可以保证资源的修改是不会有冲突的。

    对于单件模式,我简要总结如下

    1. 控制实例化
    2. 并不常用
    3. 可以由静态类代替

    下面是一个综合例子

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading;
    
    namespace Sample
    {
        class Program
        {
            static void Main(string[] args)
            {
                for (int i = 0; i < 10; i++)
                {
    
                    Thread t = new Thread(() =>
                    {
                        Singleton.getInstance();
                    });
                    t.Start();
    
    
                }
    
                Console.Read(); 
            }
        }
    
        public class Singleton
        {
            private Singleton() { }
    
            private static Singleton instance = null;
            private static object obj = new object();
            public static Singleton getInstance()
            {
                Console.WriteLine("线程号:{0}于{1}进入方法", Thread.CurrentThread.ManagedThreadId, DateTime.Now);
                lock (obj)
                {
    
                    Console.WriteLine("线程号:{0}于{1}进入锁定", Thread.CurrentThread.ManagedThreadId, DateTime.Now);
                    Thread.Sleep(5000);//休眠5秒钟
    
                    //这个方法比上面有所改进,不用每次都进行生成对象,只是第一次 //使用时生成实例,提高了效率! 
                    if (instance == null)
                        instance = new Singleton();
    
                    Console.WriteLine("线程号:{0}于{1}完成操作", Thread.CurrentThread.ManagedThreadId, DateTime.Now);
    
                    return instance;
                }
    
            }
        }
    
    }
    
    该程序运行的效果如下
    image 
    也就是说,不同的线程确实可以同时进入一个方法,但如果遇到了lock语句,而且lock语句块没有结束之前,它就需要等待,这样就是依此进入的效果
     
     
  • 相关阅读:
    iis出现2145318902错误
    div在父容器中水平垂直居中
    SSRS中错误:为用户“NT AUTHORITY\NETWORK SERVICE”授予的权限不足,无法执行此操作。 (rsAccessDenied)解决方案
    数字签名
    SQL无法连接问题
    DataTable导出到excel中,及乱码问题
    Could not load file or assembly 'Microsoft.ReportViewer.Common, Version=11.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91' or one of its depe
    Windows 7无法启动“bootmgr is compressed”解决办法
    U盘安装xp
    IIS7下浏览网站出现503,应用程序池无法启动.事件查看器中出现"Windows 找不到本地配置文件,正在用临时配置文件让您登录。当您注销时,对此配置文件所作的更改将丢失。"
  • 原文地址:https://www.cnblogs.com/chenxizhang/p/1675310.html
Copyright © 2020-2023  润新知