Java设计模式之单例模式

题外话:之前一直在看大话设计模式,当时看的很明白,但是一直没有试着写。所以导致记忆不是很深刻,所以现在一边重新学习,一边试着敲一边代码,当然也参考了一些大神的代码,这里一一谢过。

单例模式(也叫单件模式)的作用就是保证在整个应用程序的生命周期中,
       任何一个时刻,单例类的实例都只存在一个(当然也可以不存在)

以下是线程安全的双重检测单例模式写法

/**
 * 
 */
package org.designpatterns.singleton;

/**
 * @author  stone
 * @version  [版本号, 2015-12-21]
 * 
 * @return 单例模式(也叫单件模式)的作用就是保证在整个应用程序的生命周期中,
       任何一个时刻,单例类的实例都只存在一个(当然也可以不存在)
 */
public class Singleton {
	
	private static volatile Singleton singleton = null;
	
	//一个空的私有的构造函数
	private Singleton() {
		
	}
	
	public static Singleton getSingletoClass(){
		if(singleton == null){  //A
			synchronized (Singleton.class) {//B
				if(singleton == null){ //C
					singleton = new Singleton();//D
				}
			}
		}
		return singleton;
	}
	
	
	 public static void main(String[] args) 
     { 
         Singleton singletonOne = 
             Singleton.getSingletoClass(); 
         Singleton singletonTwo = 
             Singleton.getSingletoClass();

         if (singletonOne.equals(singletonTwo)) 
         { 
             System.out.println("singletonOne 和 singletonTwo 代表的是同一个实例"); 
         } 
         else 
         { 
             System.out.println("singletonOne 和 singletonTwo 代表的是不同一个实例"); 
         }

     } 
	
	
}
分析:

1.当线程1进入A位置时,检查singleton是否为null,此时为空。

2.正好此时线程2也进入A位置,且线程切换到线程2执行,同样检查singleton为null,于是往下执行但B位置时,此时由于是synchronized的所以只能有一个线程进行操作,并且在C位置判断为null,于是实例化了该对象(D位置)。

3.现在线程切换到线程1运行线程1进入B位置,此时也只能有线程1进行操作,进入C位置判断时,由于线程的时候已经实例化了该对象所以线程1在这里不满足条件。


你可能感兴趣的:(Java设计模式)