最近在学单例模式,一些想法和大家交流。
为什么要有单例模式的?它在什么情况下使用的?从单例模式的定义中我们可以看出——单例模式的使用自然是当我们的系统中某个对象只需要一个实例的情况,例如:操作系统中只能有一个任务管理器,操作文件时,同一时间内只允许一个实例对其操作等,既然现实生活中有这样的应用场景,自然在软件设计领域必须有这样的解决方案了(因为软件设计也是现实生活中的抽象),所以也就有了单例模式了。
说到单例模式,大家第一反应应该就是——什么是单例模式?,从“单例”字面意思上理解为——一个类只有一个实例,所以单例模式也就是保证一个类只有一个实例的一种实现方法罢了,下面给出单例模式的一个官方定义:确保一个类只有一个实例,并提供一个全局访问点。要保证一个类只有一个实例,可以在类里面创建自身的一个私有实例,并提供一个公共的方法来访问他,所以这个类的构造函数必须是私有的,不允许外界直接来创建实例。大家请看下面代码:
上面的实例在单线程的情况下是很好的,但是在多线程的情况下会出现一个问题,当两个线程同时运行到GetInstance方法时,此时两个线程判断(uniqueInstance ==null)这个条件时都返回真,此时两个线程就都会创建Singleton的实例,这样就违背了我们单例模式初衷了,既然上面的实现会运行多个线程执行,那我们对于多线程的解决方案自然就是使GetInstance方法在同一时间只运行一个线程运行就好了。可以参照下面一段代码,这是懒汉模式的单例设计
这样当第一个线程运行到判断instance是否存在时如果不存在则会上锁,那么下一个线程将会挂起等待,很好的解决的多线程的问题。
还有一种是饿汉模式的单例设计:
internal class Person { public string name; private Person() { } static Person p=new Person(); public static Person GetInstance() { return p; } }
这是个人最近学习单例模式的一些体会,希望对大家有所帮助,水平有限欢迎大家多多指教。
共同学习,共同进步。