另类的Singleton模式

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;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值