一个单例模式代码:
public class SingletonTest
{
        public static void main(String[] args)
        {
                Singleton singleton = Singleton.getInstance();
                Singleton singleton2 = Singleton.getInstance();                System.out.println(singleton == singleton2);
        }
}class Singleton
{
        private static Singleton singleton = new Singleton();
        
        private Singleton()
        {
                
        }        public static Singleton getInstance()
        {
                
                return singleton;
        }
}singleton 和singleton2相同,是同一个对象,为什么呢?主要就是private static Singleton singleton = new Singleton();
这一句,加了static是不是说new Singleton()只执行一次,第一次Singleton singleton = Singleton.getInstance();时加载Singleton,初始化Singleton属性,第二次
Singleton singleton2 = Singleton.getInstance();时,因为内存中有singleton属性,就不new Singleton(),直接返回原singleton呢???
请大侠给解释解释,谢谢
这里使用的是饿汉式单例,对于private static Singleton singleton = new Singleton();有解释说jvm保证singleton只被初始化一次,这是一个什么机制????是不是可以这样理解啊,对于
private static Singleton singleton = new Singleton();
可以看成这样:
private satic Singleton singleton;
static {singleton = new Singleton(); }
因为静态块只在类加载的时候执行一次,所以不管调用多少次,private static Singleton singleton = new Singleton();只执行一次,所以也就只有一个对象了。请问以上理解是否正确?????

解决方案 »

  1.   

    理解不正确啊。如果一个成员被声明为static,它是指能直接用类名点出成员名,而不必实例化对象,被static修饰的成员是类的所有实例共有的。单例模式之所以是单例的原因是因为构造方法是私有的,你无法通过new来实例化一个Singleton的对象,而只能通过get方法来获得实例对象。所以你两次获得的single对象是同一个。
      

  2.   


    如1楼所说,你理解不正确。根本没有第二次这个概念。static的属性,是在类定义被JVM所加载时就初始化完毕的,跟被调用次数毫无关系。
      

  3.   

    类的静态属性是在类加载的时候建立的。你后边2次调用getInstance之是吧之前建立的属性对象的引用赋值给你建立的引用对象。单例模式看名字就知道,单一的实例,也就是一个类只能被实例化一次。当然这里不是说我们建立的类只能被实例化一次,而是通过某种方法使程序中获取的所有该类的对象都为同一个对象,当然最好是只能被实例化一次,比如像楼主类似的写法  一个私有构造函数,一个私有的类成员变量,同个一个方法获得这个类成员变量对象,其他也很多种实现方式。
      

  4.   

    static 修饰的属性在类加载时初始化,这时new出一个对象,又因为这个属性是private的,其他类无法访问与修改,同时构造函数是私有的,其他类也无法new新对象,而这个对象本身提供的访问方法getInstance()仅仅是返回属性值,即singleton对象引用,而如果getInstance方法提供了修改singleton属性值的方法,如singleton = new Singleton()的话,就能重新生成新的对象,这时单例也就不成立了,也就是说单例的维护是类本身不对外提供构造函数和自身又不改变singleton属性值来实现的,这样理解对不??
      

  5.   


    差不多,只是你这么进行表述,猛看起来因果有点反。首先单例模式本身设计意图上就是要避免多次new对象出来,为了实现这两个目标:
    1、限制外部无法调用其构造函数;
    2、内部控制好一定都是返回同一个实例,而不会意外发生多次new。