public class DAOFactory {
private static DAOFactory instance;

static {
instance = new DAOFactory();
}

private DAOFactory() {}
//synchronized这个同步在这里有用吗???
public static synchronized DAOFactory getInstance() {
if(instance == null) {
instance = new DAOFactory();

return instance;
}
}问题1:这个单例模式有问题吗?
问题2:请问这个静态的instance在内存中是如何分配的!(我听说引用类型都是在堆里分配内存,static是在数据段分配内存的)

解决方案 »

  1.   

    是的
    synchronized在这里有用;内存分配也如你所说
      

  2.   

    static 区块一定是同步执行的,所以这个 synchronized 完全没必要了,if 判断也不需要,直接 return 就行了。另外在声明的地方还加个 final 就差不多了:
    public class DAOFactory {
        private static final DAOFactory instance;
        
        static {
            instance = new DAOFactory();
        }
            
        private DAOFactory() {}    public static synchronized DAOFactory getInstance() {
            return instance;
        }
    }
      

  3.   

    忘了去掉 synchronized
    public class DAOFactory {
        private static final DAOFactory instance;
        
        static {
            instance = new DAOFactory();
        }
            
        private DAOFactory() {}    public static DAOFactory getInstance() {
            return instance;
        }
    }
      

  4.   

    那么static修饰的引用类型,在内存中是怎么分配的呐?
      

  5.   

    程序在执行时肯定要从主函数开始,里面有对象时程序会通过栈区的引用地址去找对象
    如果方法内有变量时,那要看类型了.
    如果是基本类型变量,比如int、char等那么都会直接存到栈区,
    如果是String类型则会存在数据区,且栈区会有此变量的引用,程序会通过引用去找此变量,
    如果是static类型的话,也会存到数据区,因为它属于类本身的,而不是属于对象的,(切记方法里肯定不会出现static类型变量)
    希望我的回答能给你有些帮助!
      

  6.   

    1 只听说过java只有堆内存与栈内存,一切new出来的东西都放在堆内存中(目前这样理解就够了,因为有时JVM做优化会把对象放到栈中)
    2 那个synchronized是必须的(一般不推荐使用那种单态,效率不高,每次都要同步)
    3 真正完全没有问题的单态好像没有(在跨JVM,跨EJB服务器的情况下可能会有问题),一般情况下用楼主写的那个也可以了
    都是道听途说,希望对LZ有点帮助!
      

  7.   

    上面有人说了。
        public static synchronized DAOFactory getInstance() {
            if(instance == null) {
                instance = new DAOFactory();
            } 
            return instance;
        }
    这里完全没有必要同步,也没有必要判断null,直接
        public static DAOFactory getInstance() {        return instance;
        }
    足够了,因为静态的instance是主动加载而不是懒加载的,对于静态字段初始化由JVM提供额外的线程安全性保证
    (并不是上面那位说的自动同步)。这个过程发生在类加载后到类被任意线程访问之前。简单说任何线程在访问到这个
    类时那个初始化块实际已经完成。下面直接return就行了。