zoukankan      html  css  js  c++  java
  • 设计模式(七):单例模式

    一、定义

    单例就是一个实例。从始至终我们只需要维护这么一个实例,来节约资源。

    二、实例

    我们用构造函数创建实例,现在我们要维护此类只维护一个实例,那么我们需要将生产实例的能力也就是构造函数加以限制。

    并通过一个统一的函数对外公开我们维护的唯一的实例。

    2.1 第一代单例模式:利用懒加载,在确实要使用实例的时候才会创建单例

    public class Single_1
        {
            private static Single_1 single = null;
            private Single_1()
            {
            }
            public static Single_1 GetInstance()
            {
                if (single == null)
                {
                    single = new Single_1();
                    Console.WriteLine("创建实例");
                }
                return single;
            }
        }

    保证创建一个实例,但是只是在单线程的环境下,如果多线程会怎么样?试试!!

    客户端并发100线程:

    //------------------------单例模式-----------------------
                System.Threading.Tasks.Parallel.For(0, 100, t => { Singleton.Single_1.GetInstance(); });
                Console.ReadKey(); 

    运行结果:运行结果由系统随即切片,可能结果不同。但是确实存在创建了多个实例。

    2.2 针对多线程之间的同步问题:加锁

    public class Single_2
        {
            private static Single_2 single = null;
            private static object lockkey = new object();
            private Single_2()
            {
            }
            public static Single_2 GetInstance()
            {
                lock (lockkey)
                {
                    if (single == null)
                    {
    
                        single = new Single_2();
                        Console.WriteLine("创建实例");
                    }
                    return single;
                }
            }
        }

    效率高点的双检锁:

     public static Single_2 GetInstance()
            {
                if (single == null)
                {
                    lock (lockkey)
                    {
                        if (single == null)
                        {
                            single = new Single_2();
                            Console.WriteLine("创建实例");
                        }                   
                    }
                }
                return single;
            }

    2.3 静态构造函数构造单例:我们知道静态构造函数是线程安全的

    public class Single_3
        {
            private static Single_3 single = null;
            private Single_3()
            {
            }
            static Single_3()
            {
                single = new Single_3();
                Console.WriteLine("静态实例");
            }
    
            public static Single_3 GetInstance()
            {
                return single;
            }
        }

    三、总结

    合理使用单例模式可以提高性能节约内存。当然,现实项目中有很多的例子,至少项目中可以很常见单例子模式。

  • 相关阅读:
    playbook实现httpd服务安装与配置
    Ansible介绍与安装使用
    Servlet 连接mysql数据库
    day04作业
    day03python作业
    正式课第一天作业
    函数
    周作业
    数据类型
    day03作业
  • 原文地址:https://www.cnblogs.com/sunchong/p/5120944.html
Copyright © 2011-2022 走看看