完美的单例模式

一、立即加载模式(饿汉模式)

/**
 * 立即加载模式(饿汉模式)
 * 
 * @author LZN
 *
 */
public class SingleOne {
	
	private static SingleOne singleOne = new SingleOne();
	
	private SingleOne() {
		// TODO Auto-generated constructor stub
	}
	
	/**
	 * 该方法保证在多线程中获取的是同一个对象
	 * 该方法缺点是不能有其他实例变量,因为getInstance()不是同步方法,会引起线程安全问题
	 * 
	 * @return
	 */
	public static SingleOne getInstance() {
		return singleOne;
	}
}

二、延迟加载模式(懒汉模式)

/**
 * 延迟加载模式(懒汉模式)
 * 
 * @author LZN
 *
 */
public class SingleOne {
	
	// 懒汉模式(DCL双检查锁机制)
	private volatile static SingleOne singleOneDCL = null;
	
	private SingleOne() {
		// TODO Auto-generated constructor stub
	}
	
	/**
	 * 采用DCL双检查锁机制,保证在多线程中获取的是同一个对象
	 * 
	 * @return
	 */
	public static SingleOne getInstance() {
		if (singleOneDCL == null) {
			// 在此处处理一些准备工作
			
			synchronized (SingleOne.class) {
				if (singleOneDCL == null) {
					singleOneDCL = new SingleOne();
				}
			}
		}
		return singleOneDCL;
	}
}

三、静态内置类实现单例模式

/**
 * 静态内置类实现单例模式
 * 
 * @author LZN
 *
 */
public class SingleOne {
	
	private static class MyObjectHandler {
		private static SingleOne singleOne = new SingleOne();
	}
	
	private SingleOne() {
		// TODO Auto-generated constructor stub
	}
	
	/**
	 * 
	 * @return
	 */
	public static SingleOne getInstance() {
		return MyObjectHandler.singleOne;
	}
}

四、利用静态初始化器实现单例模式

/**
 * 利用静态初始化器实现单例模式
 * 
 * @author LZN
 *
 */
public class SingleOne {
	
	private static SingleOne singleOne;
	
	static {
		singleOne = new SingleOne();
	}
	
	private SingleOne() {
		// TODO Auto-generated constructor stub
	}
	
	/**
	 * 
	 * @return
	 */
	public static SingleOne getInstance() {
		return singleOne;
	}
}

五、使用enum枚举实现单例模式

/**
 * 使用enum枚举实现单例模式
 * 
 * @author LZN
 *
 */
public class SingleOne {
	
	public enum MyEnumSingle {
		objectHandler;
		private SingleOne singleOne;
		
		private MyEnumSingle() {
			// TODO Auto-generated constructor stub
			System.out.println("SingleOne.MyEnumSingle.MyEnumSingle()");
			singleOne = new SingleOne();
		}
		
		public SingleOne getInstance() {
			return singleOne;
		}
	}
	
	private SingleOne() {
		// TODO Auto-generated constructor stub
	}
	
	/**
	 * 
	 * @return
	 */
	public static SingleOne getInstance() {
		return MyEnumSingle.objectHandler.getInstance();
	}
}


你可能感兴趣的:(java)