胖虎白话学习设计模式之多线程与单例模式设计模式(Singleton)

 

 

胖虎白话学习设计模式之多线程与单例模式设计模式(Singleton)
记录胖虎学习设计模式过程,不许勿喷,转载请注明出处!
http://blog.csdn.net/ljphhj

1.存在问题
开发中我们经常会遇到一种情况,就是需要创建一个对象来完成一些功能,但是不论如何创建这样的对象,我们都想要保证别人使用这个类的时候,不会创建多个类的实例
(PS:有写得不对的,希望可以给我留言哈!)

那么引入解决方法:单例设计模式


2.单例设计模式(Singleton)


单例设计模式主要用于:确保某个类只有一个实例,并且为该类提供一个访问该实例对象的静态方法.

 

 

从具体实现角度来说,就是以下三点:

一是单例模式的类只提供私有的构造函数,

二是类定义中含有一个该类的静态私有对象,

三是该类提供了一个静态的共有的函数用于创建或获取它本身的静态私有对象。


3.单例设计模式的几种代码形式

单例模式普遍写法1: 在编译的时候即创建类实例对象

 

 

 

package cn.xym.test;
	/**
	 * 单例模式普遍写法1
	 * 
	 * @author 胖虎
	 *
	 */
	public class Factory {
		private static Factory factory = new Factory();
		
		//声明一个私有的构造函数,便自己能调用
		private Factory(){
			
		}
		
		//提供一个得到这个唯一实体对象的静态方法
		public static Factory getInstance(){
			return factory;
		}
		
	}

 




单例模式普遍写法2(滞后初始化): 在首次需要该类实例对象的时候创建实例

 

 

 

 

package cn.xym.test;
	/**
	 * 单例模式普遍写法2
	 * 
	 * @author 胖虎
	 *
	 */
	public class Factory {
		private static Factory factory = null;
		
		//声明一个私有的构造函数,便自己能调用
		private Factory(){
			
		}
		
		//提供一个得到这个唯一实体对象的静态方法
		public static Factory getInstance(){
			if (factory == null){
				factory = new Factory();
			}
			return factory;
		}
	}

 

 

 

 

4.单例设计模式与多线程的结合

 

 

 

 

 

 

以上2种普遍方式的代码,都会存在一个问题:线程安全问题.
当引入多线程时,针对普遍写法2进行代码讨论:
如果线程1和线程2同时访问单例类中的getInstance()的方法,线程1判断factory==null之后,此时CPU发生了时间片轮转切换,到线程2执行,此时线程2也刚好访问getInstance()的方法,也判断到当前factory==null,这之后线程1和线程2将会都创建一次factory实例.

为了解决多线程的问题,需要引入同步锁机制

引入锁之后的代码:

 

package cn.xym.test;
		/**
		 * 单例模式和多线程结合的写法,解决线程安全问题!
		 * 
		 * @author 胖虎
		 *
		 */
		public class Factory {
			private static Factory factory = null;
			private static Object mylock = Factory.class;
			private int count = 0;
			
			//声明一个私有的构造函数,便自己能调用
			private Factory(){
				
			}
			
			//提供一个得到这个唯一实体对象的静态方法
			public static Factory getInstance(){
				synchronized (mylock) {
					if (factory == null){
						factory = new Factory();
					}
					return factory;
				}
			}
			
			//想说明:当操作内部变量的时候也要考虑线程安全问题哈
			public void AddCount(){
				synchronized (mylock) {
					count++;
				}
			}
		}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 酷酷鲨 设计师:CSDN官方博客 返回首页