Kevin Su bio photo

Kevin Su

patience, persevere, and enjoy

Email Github Stackoverflow

###单例模式-Singleton

单例模式用于全局可以调用,只有一个实例的情况,例如,一个程序只有一个配置文件,其他类都可以访问其中的配置参数。一般单例模式是用得比较多,也因为比较容易使用。

普通的单例模式: 因为不能让Client能有通过构造方法来获取实例,所有需要把构造函数私有化。

		class Singleton
			{
				private Singleton instance;
				private Singleton(){}
				public Singleton getInstance()
				{
					if(instance == null)
					{
						instance = new Singleton();
					}
					return instance;
				}
			
			}

但是,普通的单例模式,在面对多线程的操作下,就会出现问题。 当多个线程同时调用getInstance方法是,就很有可能获取多个实例,这违背了单例模式的意图。所以,这个时候我们就需要加锁。

		class Singleton
		{
			private Singleton instance;
			private static readonly object lockHelper = new Object();*锁实例*
			private Singleton(){}
			public Singleton getInstance()
			{		
				lock(lockHelper)
				{
					if(instance == null)
					{
						instance = new Singleton();
					}
					return instance;
				}
			}
		}

这样就可以避免同时进入初始化的过程,不会再获取多个实例,但是,这又导致每次调用getInstance方法的时候 需要锁上该方法,影响效率,所以再在外面加一个判断,来避免这个问题。

	 class Singleton
		{
			private Singleton instance;
			private static readonly object lockHelper = new Object();*锁实例*
			private Singleton(){}
			public Singleton getInstance()
			{		
				if(instance == null)
				{
					lock(lockHelper)
					{
						if(instance == null)
						{
							instance = new Singleton();
						}
						return instance;
					}
				}
			}
		
		}

这样,就只会在第一次初始化的时候加锁。

当然也可以把初始化直接放变量生成的时候。

private Singleton instance = new Singleton();