码迷,mamicode.com
首页 > 其他好文 > 详细

单例模式

时间:2020-05-17 13:41:23      阅读:67      评论:0      收藏:0      [点我收藏+]

标签:volatil   问题   情况   访问   sed   class   color   适用于   close   

单例模式顾名思义就是在程序运行过程中某个类型只有有一个实例存在。使用场景非常广泛,例如我们对日志的写入只提供一个入口等。其结构图如下

技术图片

 它保证一个类仅有一个实例,并提供一个访问它的全局访问点。 

通常的实现方式是构造一个私有的构造函数,实现外部无法对它进行实例化,然后提供一个全局的访问入口

技术图片
public class Singleton
{
    private static volatile Singleton _instance;

    private Singleton()
    {
    }

    public static Singleton GetInstance()   //提供一个唯一访问入口
    {
        if (_instance == null)
        {
            _instance = new Singleton();
        }

        return _instance;
    }
}
View Code

但是这样做在多线程下可能会出问题,如果两个线程同时进入了入口,那么系统就可能出现两个实例。通常在多线程情况下可以通过加锁来保证线程安全

技术图片
public class Singleton
{
    private static volatile Singleton _instance;    
    private static object _lock = new object();
    private Singleton() { } //构造函数设置为private,外部无法进行实例化

    public static Singleton GetInstance()
    {
        if (_instance == null)
        {
            lock (_lock)
            {
                _instance = new Singleton();
            }
        }

        return _instance;
    }
}
View Code

当然还有另外一个更加简单的实现方式

技术图片
public class Singleton
{
    private static readonly Singleton Instance = new Singleton();
    private Singleton() { }

    public static Singleton GetInstance()
    {
        return Instance;
    }
}
View Code

这种方式中的instance会在类被加载时候进行实例化,它由系统来保证线程安全。

 

该模式主要适用于当类只能有一个实例而且客户可以从一个众所周知的访问点访问它时。

 

单例模式

标签:volatil   问题   情况   访问   sed   class   color   适用于   close   

原文地址:https://www.cnblogs.com/aohost/p/12904464.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!