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

23、面向对象的设计模式之单例模式--基础概念及概念

时间:2020-06-09 20:11:25      阅读:62      评论:0      收藏:0      [点我收藏+]

标签:单线程   单例对象   实例化   color   ola   多线程实例   设计模式之单例模式   时间   一个   

单例模式的定义如下:

  单例模式(Singleton Pattern):确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例,这个类成为单例类,它提供全局访问的方法。单例模式是一种对象创建型模型。

 

单例模式的分类:

  饿汉单例

  懒汉单例

  单线程单例

  多线程单例

 

饿汉单例:

public class EagerSingleton
{
    // 由于在定义变量的时候实例化单例类,在类加载时就已经创建了单个对象。
    private static EagerSingleton instance = new EagerSingleton();
    private EagerSingleton()
    {

    }
    public static EagerSingleton GetInstance()
    {
        return instance;
    }
}

懒汉单例:

//在第一次调用GetInstance()方法时实例化,在类加载并不自行实例化。这种技术叫做延迟加载(Lazy Load),就是在需要的时候在加载实例。
//为了避免多线程调用GetInstance方法。加lock
public class LazySingleton
{
    private static LazySingleton instance = null;
    private LazySingleton()
    {

    }
    public static LazySingleton GetInstance()
    {
        if(instance == null)
        {
            new LazySingleton();
        }
        return instance;
    }
}

单线程单例模式:

public class SingleThreadSingleton
{
    private static SingleThreadSingleton instance = null;
    private SingleThreadSingleton()
    {

    }

    public static SingleThreadSingleton GetInstance()
    {
        if(instance == null)
        {
            instance = new SingleThreadSingleton();
        }
        return instance;
    }
}

多线程单例:

public class MultiThreadSingleton
{
    private static MultiThreadSingleton instance;
    private static readonly object syncRoot = new object();//静态的只读的辅助对象
    private MultiThreadSingleton()
    {

    }

    public static MultiThreadSingleton GetInstance()
    {
        lock (syncRoot) // 同一时刻枷锁的这部分程序只有一个线程进入。但是有一个问题这样会影响效率
        {
            if(instance == null)
            {
                instance = new MultiThreadSingleton();
            }
        }
        return instance;
    }
}

多线程实例改良版: 

public class MultiThreadSingleton
{
    //  volatile 保证严格意义的多线程编译器在代码编译时对指令不进行微调
    private static volatile MultiThreadSingleton instance = null;
    private static readonly object syscRoot = new object();
    private MultiThreadSingleton()
    {

    }
    public static MultiThreadSingleton GetInstance()
    {
        
        if(instance == null)// 多个线程调用GetInstance方法时,都可以通过第一重if(instance == null),可以提升效率
        {
            lock (syscRoot) //只有一个线程时进入
            {
                if(instance == null) // 如果没有这层,第一个线程创建了实例,第二个线程还可以创建实例。
                {
                    instance = new MultiThreadSingleton();
                }
            }
        }
        return instance;
    }
}

静态单例模式:

public class StaticSingleton
{
    public static readonly StaticSingleton instance = new StaticSingleton();
    private StaticSingleton()
    {

    }
}
public class StaticSingleton
{
    public static readonly StaticSingleton instance;
    private StaticSingleton()
    {

    }

    static StaticSingleton()
    {
        instance = new StaticSingleton();
    }
}

饿汉单例与懒汉单例类比较

  饿汉单例在类被加载时就将自己实例化,它的优点在于无需考虑多线程访问问题,可以保证实例的唯一性;从调用速度和反应时间角度来讲,由于单例对象一开始就得以创建,因此要优于懒汉式单例。但是无论系统在运行时是否需要使用该单例对象,由于在类加载时该对象

23、面向对象的设计模式之单例模式--基础概念及概念

标签:单线程   单例对象   实例化   color   ola   多线程实例   设计模式之单例模式   时间   一个   

原文地址:https://www.cnblogs.com/sy-liu/p/13079937.html

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