先看代码:
public class Singleton{
 private Singleton singleton = new Singleton();
 private Singleton(){
 }
 private Singleton getInstance(){
  return singleton;
 }
}
这段代码为什么能在jvm里只生成一个实例?

解决方案 »

  1.   

    喔,应该是这样的:
    public class Singleton{
     private Singleton singleton = new Singleton();
     private Singleton(){
     }
     public Singleton getInstance(){
      return singleton;
     }
    }
    private Singleton 改成 public Singleton
      

  2.   

    正确的应该是这样的
    public class Singleton{
     private static Singleton singleton = new Singleton();
     private Singleton(){
     }
     public static Singleton getInstance(){
      return singleton;
     }
    }
    因为构造函数是私有的,你不能通过new Singleton()来创建实例,只能通过一个静态公有的成员函数获得实例(必须是静态的,因为静态方法是属于类的,用类.方法就可访问),而且singleton是一个静态的成员,只会产生一个实例。
      

  3.   

    哈哈,如果getInstance()不采用静态的话,那这个类就是一个不能用的类了。
      

  4.   


    二楼正确...这种方式叫饿狗式其实还有一种方式的Singleton写法,与此有点区别的...这种方式叫懒汉式
    public   class   Singleton  

      private   static   Singleton   singleton   =  null; 
      private   Singleton(){ 
      } 
      public   static   Singleton   getInstance()
      { 
        if( singleton == null)
        {
           singleton = new  Singleton();  
        }
        return   singleton; 
      } 
    }
      

  5.   

    如果谈的更底层些,这个类在一开始 Singleton.getInstance() 时就会初始在内存中,以后一直保留是吗?
      

  6.   

    如果不用 Singleton.getInstance() 是否会初始化?
      

  7.   

    应该改成如下代码
    因为static 变量 在访问此类的时候会初始化
    然后一直存在这个实例public class Singleton{
     private static Singleton singleton = new Singleton();
     private Singleton(){
     }
     private Singleton getInstance(){
      return singleton;
     }
    }
      

  8.   

    再继续往下深入:example1.java 中 Singleton sing = Singleton.getInstance(); 取的了 Singleton 的实例。example2.java 中再次取的 还是要用 Singleton sing = Singleton.getInstance();这样的形式吗?有没有直接指向对象(我是指像访问内存中的对象一样)
      

  9.   

    http://java.chinaitlab.com/model/734301_2.html//看下这篇文件总结并详细介绍了单例模式
      

  10.   

    再继续往下深入:example1.java   中   Singleton   sing   =   Singleton.getInstance();   取的了   Singleton   的实例。example2.java   中再次取的   还是要用   Singleton   sing   =   Singleton.getInstance();这样的形式吗?有没有直接指向对象(我是指像访问内存中的对象一样)
    --------------------------------------------------------------------------------------------------------------------------------
    两个对象指向同一块内存.
    单例模式 ...只能有一个实例
    static属于共享的资源.
      

  11.   

    public class Singleton{
       private static Singleton singleton=null;
       private Singleton{
       }
       public static Singleton getSingleton{
            if(singleton==null){
             singleton=new Singleton();
          }
            return singleton;
       }
    }
      

  12.   

    public   class   Singleton{
          private   static   Singleton   singleton=null;
          private   Singleton{
          }
          public   static   Singleton   getSingleton{
                    if(singleton==null){
                      singleton=new   Singleton();
                }
                    return   singleton;
          }
    }类似这种代码都是不是最佳的。baidu 双检锁。另外在naming上不要那么死心眼都getInstance
    public static Object instance() {
    }这样不就得了。此外,还有,所有的Singleton都是一个模式的,应该学会用模版封装,这才能体现泛型的价值 唉 
      

  13.   

    JAVA 是不能像 c 一样实现双检锁的。
      

  14.   

    JAVA   是不能像   c   一样实现双检锁的。
    这是阎博士说的....具体咋回事没具体看..........
      

  15.   

    6楼的懒汉式单例要加同步才安全哦!
    回楼主,当定义一个类的成员为static时,该类所有的对象共享这一个成员再加上把构造器定义为private 所以在该类的外面是不能构造该类的对象的所以这种模式叫单例模式
      

  16.   

    利用double-checked可支持线程安全public   class   Singleton{
          private   static   Singleton   singleton=null;
          private   Singleton{
          }
          public   static   Singleton   getSingleton{
              if(singleton==null){
                 synchronized (Singleton.class){
                      if(singleton == null)         
                      singleton = new Singleton();
                 }
               }
                    return   singleton;
          }
    }