论坛首页 Java企业应用论坛

单例模式(Singleton)

浏览 16388 次
精华帖 (0) :: 良好帖 (4) :: 新手帖 (19) :: 隐藏帖 (0)
作者 正文
   发表时间:2010-06-18   最后修改:2010-06-18
beneo 写道
myumen 写道
搜索到个更牛的写法,既满足Lazy load,又满足只有一个实例,即使多线程环境也是一个实例。
public class Singleton {     
    
    static class SingletonHolder {     
    
        static Singleton instance = new Singleton();     
    
    }     
    
    public static Singleton getInstance() {     
    
        return SingletonHolder.instance;     
    
    }     
}


这个的确牛

Apache就是这么实现的,不过SingletonHolder是私有内部静态类...
0 请登录后投票
   发表时间:2010-08-26  
BestUpon 写道
gstarwd 写道
BestUpon 写道
gstarwd 写道
“new Singleton()不是一个atomic的操作。 ”

这样的操作在java中多么?

为什么这个能保证延迟加载呢?

BestUpon 写道
/**
*使用 static 字段的单例实现
**/
class Singleton
{
  private Vector v;
  private boolean inUse;
  private static Singleton instance = new Singleton();//这个为什么能保证延迟加载呢》?
  private Singleton()
  {
    v = new Vector();
    inUse = true;
    //...
  }

  public static Singleton getInstance()
  {
    return instance;
  }
}

 

 

 

这个不能保证是延迟加载,而是饿汉方式!是为了解决双重锁定问题!

那么这个 为什么能呢?(我是提问的语气哦。。。不是反问的语气 - =)

public class Singleton {     
    
    static class SingletonHolder {     
    
        static Singleton instance = new Singleton();     
    
    }     
    
    public static Singleton getInstance() {     
    
        return SingletonHolder.instance;     
    
    }     
}

 

 

你说的这种写法我也是第一次见:我的理解是这样的

 

public class Singleton {     
    
    static class SingletonHolder {    //静态内部类 
    
        static Singleton instance = new Singleton();     
    
    }     
    
    public static Singleton getInstance() {     
    
        return SingletonHolder.instance;     
    
    }     
}

 静态类在一开始就初始化好了,并且该静态类包含在Singleton这个类中,调用 getInstance()的时候返回的是SingletonHolder.instance;这个过程是相对而言的,意思是说,Singleton 这个类没有在初始化的时候

创建对象,而是创建了一个内部类的SingletonHolder,让他去创建Singleton的一个对象,这样在思维和逻辑上,Singleton在初始化的时候没有创建对象,而是在get的时候才创建对象的。

我觉得是相对而言,思维上的理解,不是绝对的没有创建对象,也不是绝对的延迟加载!不知道我理解的对不对!还望大家指教!

 

 

 

 


 

我认为应该是延迟加载(当然我不知道对不对,如果错了,请大家指出来):首先jvm在启动的时候不会加载 SingletonHolder 这个静态内部类,也就说程序先执行

getInstance(),然后转到 SingletonHolder.instance()里面,然后方法里面有 new关键字,也就是jvm在这个时候加载 Singleton ,所以我觉得应该是延迟加载

 

0 请登录后投票
   发表时间:2010-08-27  
myumen 写道
搜索到个更牛的写法,既满足Lazy load,又满足只有一个实例,即使多线程环境也是一个实例。
public class Singleton {     
    
    static class SingletonHolder {     
    
        static Singleton instance = new Singleton();     
    
    }     
    
    public static Singleton getInstance() {     
    
        return SingletonHolder.instance;     
    
    }     
}


怎么还这么多人不知道这个?老早就在je看到过了
参见http://en.wikipedia.org/wiki/Initialization_on_demand_holder_idiom
个人理解:
原因:类在调用getInstance方法才会初始化(并非实例化)SingletonHolder,并且该过程是由jvm来保证其单线程执行的
sun的初始化的描述
A class or interface type T will be initialized immediately before the first occurrence of any one of the following:
T is a class and an instance of T is created.
T is a class and a static method declared by T is invoked.
A static field declared by T is assigned.
A static field declared by T is used and the field is not a constant variable (§4.12.4).
T is a top-level class, and an assert statement (§14.10) lexically nested within T is executed.
0 请登录后投票
   发表时间:2010-11-10  
大家都打个例子 自己试下就知道执行顺序了。
0 请登录后投票
   发表时间:2010-11-10  
Enum.instance
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics