`

JAVA单例设计模式Single--饿汉式-懒汉式-多线程中的设计

    博客分类:
  • JAVA
阅读更多
/**
 * 单例设计模式--懒汉式--饿汉式
 * 
 * 懒汉式--适用于实例的延迟加载--如果多线程访问,容易出现安全问题--可以通过加同步锁解决
 * 加锁的效率问题需要考究
 * 
 * 延迟加载的单例设计模式--懒汉式
 */ 
 //饿汉式
 class Single1
 {
 	private static final Single1 s = new Single1();
 	private Single1(){}
 	public static Single1 getInstance(){
 		return s;
 	}
 }
 //懒汉式--有问题的
 /**
  * 在多线程访问过程中会产生安全隐患
  */
// class Single2{
// 	private static Single2 s = null;
// 	private Single2(){}
// 	
// 	public static Single2 getInstance(){
// 		if(s==null){
// 			//线程进入A--阻塞
// 			//线程进入B--阻塞
// 			//A唤醒--new一次
// 			//B唤醒--new一次
// 			//==>单例失效
// 			s = new Single2();
// 		}
// 		return s;
// 	}
// }
 //安全解决方案
// class Single2{
//	 	private static Single2 s = null;
//	 	private Single2(){}
//	 	
//	 	//问题--多线程,每个线程都想获取实例例都要判断一次锁--懒汉式加锁会影响程序效率
//	 	//B不能进入--
//	 	public static synchronized Single2 getInstance(){
//	 		if(s==null){
//	 			//A线程进入--阻塞--有同步锁
//	 			s = new Single2();
//	 		}
//	 		return s;
//	 	}
//}
 //懒汉式--升级
 class Single2{
 	private static Single2 s = null;
 	private Single2(){}
 	/**
 	 * 通过双重判断以提高懒汉式的效率
 	 */
 	public static Single2 getInstance(){
 		if(s==null){
 			//2.B线程进入--被锁挡住,停止
 			synchronized(Single2.class)
 			{
 				//4.B进入不满足--null return s
		 		if(s==null){
		 			//1.A线程进入--阻塞
		 			//3.A唤醒--执行完毕
		 			s = new Single2();
		 		}	
	 		}
 		}
 		return s;
 	}
 }
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics