论坛首页 Java企业应用论坛

单例模式(Singleton)

浏览 16387 次
精华帖 (0) :: 良好帖 (4) :: 新手帖 (19) :: 隐藏帖 (0)
作者 正文
   发表时间:2010-06-16  
如果singleton这个class里面的东东都是对象的方法或变量,就没有必要lazy了吧,必须通过getinstance来使用里面的方法,所以类加载时初始化就可以了,没人用到这个类自然不会加载,除非有其他的static成员
0 请登录后投票
   发表时间:2010-06-17  
Agrael 写道
双重锁定在java里一定要保证可见性,你的例子里没保证这一点额。

兄台说的可见性,是否是使用声明称“Volatile ”?
0 请登录后投票
   发表时间:2010-06-17  
slaser 写道
LZ,你的double-checking lock 是错误的。
new Singleton()不是一个atomic的操作。
你的instance可能处于一个不是null,但是又不是完整对象的状态。
这样会导致程序崩溃。

你说的很对!我以前没有意识到这一点,多线程没有想到线程的中断和独占问题!谢谢你的提醒!
0 请登录后投票
   发表时间:2010-06-17  
silence1214 写道
double check出来很久了吧 怎么又搞出来了。

前车之鉴还是得学习的嘛!
0 请登录后投票
   发表时间:2010-06-17  
kraft 写道
如果singleton这个class里面的东东都是对象的方法或变量,就没有必要lazy了吧,必须通过getinstance来使用里面的方法,所以类加载时初始化就可以了,没人用到这个类自然不会加载,除非有其他的static成员

所谓的加载,是在程序一启动的时候加载还是在访问的时候加载!在程序一启动的时候就加载该类对象实例,该实例中包含的所有的有用信息,如果类很庞大的话,启动速度当然会很慢(对该类实例化耗费时间),而耗费了很大力气初始化好了该对象实例,但是用它的时候很迟很迟,可以说是在将来很长一段时间,都不会用到该类的实例,但是他却一直在contain中,是不是很耗资源呢?而在其访问的时候去加载它,虽然加载的时候会消耗一部分时间,但是换来了以前所有资源的节约,你说有没有必要实行延迟加载呢?
0 请登录后投票
   发表时间:2010-06-17   最后修改:2010-06-17
“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;
  }
}

 

0 请登录后投票
   发表时间:2010-06-17  
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;
  }
}

 

 

 

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

0 请登录后投票
   发表时间:2010-06-17   最后修改:2010-06-17
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;     
    
    }     
}
0 请登录后投票
   发表时间:2010-06-17   最后修改:2010-06-17
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的时候才创建对象的。

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

 

 

 

 


 

0 请登录后投票
   发表时间:2010-06-17  
由于classloader使用了一次而不是二次.
当然如果classloader使用了二次.....这个也是不安全的.
0 请登录后投票
论坛首页 Java企业应用版

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