单例模式记录

Posted liuyang95

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了单例模式记录相关的知识,希望对你有一定的参考价值。

单例模式是设计模式中最简单模式了,主要作用是对于一个类,在整个项目中只实例化一次,本次记录四种实现方式,并说说优劣性。

1.懒汉模式实现:

    class Single1
    {
        //懒汉模式顾名思义,就是比较懒,在类加载的时候不调用实例方法
        //当真正调用的时候去实例化方法
        private static Single1 SingleObject;
        private Single1() { }
        public static Single1 getSingle1() {
            if (SingleObject == null) {
                SingleObject = new Single1();
            }
            return SingleObject;
        }
    }

  这里单例模式(懒汉模式)的缺点:在多线程情况下,都在访问这个类,可能在两个线程或多个线程同时进入single=null(因为其中还未来的及进行实例化),所以线程不安全。

               优点:它实例化是在真正调用这个静态方法的时候去加载内存中,而不是项目启动就加载内存中,这样对于项目启动减小负担。

本想使用多线程测试一下懒汉模式缺点,但发现使用GCHandle.Alloc();获取地址的值每次发生变,网上查了下,发现C#不支持地址获取,并且这个值每次发生变化。

2.饿汉模式实现:

 

    class Single2
    {
        //使用饿汉模式,意思就是在项目加载的时候,实例就创建了
        private static Single2 single2 = new Single2();
        private  Single2() { }
        public static Single2 getSingle2() {
            return single2;
        }
    }

  单例模式(饿汉模式)的缺点:就是类加载的时候就创建了,这里就比较慢,对于第一次加载;

  单例模式(饿汉模式)的优点:这里线程是安全的,每次进来调用就是第一次类加载出来的那个。

上面两种方法都是很好的方法,对于一个单例模式来说

 为了达到线程安全又不第一次就加载的情况可以在懒汉模式上加锁判断,这就能对线程不安全的代码在调用的是后变成串行的。

一般都是加双重判断,这是为了在下次调用先判断,这样就不用了下次加锁判断了,对于运行速度所有提升。

3.加锁双重判断懒汉模式进化版:

 

以上是关于单例模式记录的主要内容,如果未能解决你的问题,请参考以下文章

常用代码片段

常用代码片段

单例模式

注册式单例模式简单记录

单例模式

性能比较好的单例写法