另类的Singleton形式
另类的Singleton模式另类的Singleton模式博客分类:JavaJVM多线程package com.zzq.singleton /** * Double
另类的Singleton模式
另类的Singleton模式博客分类:
JavaJVM多线程package com.zzq.singleton;
/**
* Double-check Locking的模式
* @author zhiqiang.zhu
* @version $Id: Singleton.java,v 0.1 2010-9-3 下午02:41:12 zhiqiang.zhu Exp $
*/
public class Singleton {
??? /**
???? * volatile类型的变量能够保持多线程并发访问此变量的同步问题
???? * 但是只有JDK1.5以上版本才能正常使用。
???? * JDK1.4之前的许多JVM,使用volatile会导致双重检测加锁失效
???? */
??? private volatile static Singleton instance = null;
??? private Singleton() {
??? }
??? /**
???? * 获取一个单实例(用双重锁定方法)
???? * @return Singleton单实例
???? */
??? public static Singleton getInstance() {
??????? if (null == instance) {
???????????
??????????? //synchronized(Singleton.class) 这种锁发会把所有基于
??????????? //Singleton.class产生的实例对象都堵塞住(阿玺的原话)
??????????? synchronized (Singleton.class) {
???????????????
??????????????? //线程锁定后再次判断实例是否创建
??????????????? if (null == instance) {
??????????????????? instance = new Singleton();
??????????????? }
??????????? }
??????? }
??????? return instance;
??? }
}
/**
* 外国资料:http://en.wikipedia.org/wiki/Initialization_on_demand_holder_idiom
* 主要是运用了类JVM类加载器机制实现的
* @author zhiqiang.zhu
* @version $Id: Singleton.java,v 0.1 2010-9-3 下午03:00:57 zhiqiang.zhu Exp $
*/
class Something {
???
??? private Something() {
??? }
??? /**
???? * 加载Something时,首先要先加载LazyHolder
???? * @author zhiqiang.zhu
???? * @version $Id: Singleton.java,v 0.1 2010-9-3 下午03:14:54 zhiqiang.zhu Exp $
???? */
??? private static class LazyHolder {
??????? private static final Something INSTANCE = new Something();
??? }
??? public static final Something getInstance() {
??????? return LazyHolder.INSTANCE;
??? }
}