首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

另类的Singleton形式

2013-04-20 
另类的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;
    ??? }
    }

热点排行