单例模式

10 篇文章 0 订阅

单例模式,是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中,应用该模式的类一个类只有一个实例。即一个类只有一个对象实例。x 

第一种:多线程安全,线程不是每次都加锁,按需加载(懒汉模式) 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication2
{

    public class Singleton
    {
        private static Singleton singleton;

        /// <summary>
        /// 程序运行时,创建一个静态只读的进程辅助对象
        /// </summary>
        private static readonly object obj = new object();

        /// <summary>
        /// 构造方法私有,外键不能通过New类实例化此类
        /// </summary>
        private Singleton()
        {
            Console.WriteLine("创建一个对象");
        }
        public void show()
        {
            Console.WriteLine("调用一下方法");
        }

        /// <summary>
        /// 此方法是本类实例的唯一全局访问点
        /// (双重加锁 Double-Check Locking)
        /// </summary>
        /// <returns></returns>
        public static Singleton GetInstance()
        {
            if (singleton == null)//在同一时刻加了锁的那部分程序只有一个线程可以进入,实现线程安全

                lock (obj)
                {
                    //如实例不存在,则New一个新实例,否则返回已有实例
                    if (singleton == null)
                    {
                        singleton = new Singleton();
                    }
                }
            return singleton;
        }
    }
}

调用方法 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using System.Threading.Tasks;

namespace ConsoleApplication2
{
    class Test
    {
        static void Main(string[] args)
        {
           Task[] tasks=new Task[10];
            for (int i = 0; i < 10; i++)
            {
                Task task = new Task(() =>
                {
                    Singleton singleton = Singleton.GetInstance();
                    singleton.show();
                });         
                tasks[i] = task;
            }
            Singleton singleton2 = Singleton.GetInstance();
            singleton2.show();
            for (int i = 0; i < tasks.Length; i++)
            {
                tasks[i].Start();              
            }
            Console.ReadLine();
        }
    }
}

 

 第二种:静态初始化,减少开销

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication2
{

    public sealed class Singleton
    {
        private static readonly Singleton instance = null;
        static Singleton()
        {
            instance = new Singleton();
        }
        private Singleton()
        {
            Console.WriteLine("创建一个对象");
        }
        public void show()
        {
            Console.WriteLine("调用一下方法");
        }
        public static Singleton GetInstance
        {
            get
            {
                return instance;
            }
        }
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值