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是在数据段分配内存的)
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是在数据段分配内存的)
synchronized在这里有用;内存分配也如你所说
public class DAOFactory {
private static final DAOFactory instance;
static {
instance = new DAOFactory();
}
private DAOFactory() {} public static synchronized DAOFactory getInstance() {
return instance;
}
}
public class DAOFactory {
private static final DAOFactory instance;
static {
instance = new DAOFactory();
}
private DAOFactory() {} public static DAOFactory getInstance() {
return instance;
}
}
如果方法内有变量时,那要看类型了.
如果是基本类型变量,比如int、char等那么都会直接存到栈区,
如果是String类型则会存在数据区,且栈区会有此变量的引用,程序会通过引用去找此变量,
如果是static类型的话,也会存到数据区,因为它属于类本身的,而不是属于对象的,(切记方法里肯定不会出现static类型变量)
希望我的回答能给你有些帮助!
2 那个synchronized是必须的(一般不推荐使用那种单态,效率不高,每次都要同步)
3 真正完全没有问题的单态好像没有(在跨JVM,跨EJB服务器的情况下可能会有问题),一般情况下用楼主写的那个也可以了
都是道听途说,希望对LZ有点帮助!
public static synchronized DAOFactory getInstance() {
if(instance == null) {
instance = new DAOFactory();
}
return instance;
}
这里完全没有必要同步,也没有必要判断null,直接
public static DAOFactory getInstance() { return instance;
}
足够了,因为静态的instance是主动加载而不是懒加载的,对于静态字段初始化由JVM提供额外的线程安全性保证
(并不是上面那位说的自动同步)。这个过程发生在类加载后到类被任意线程访问之前。简单说任何线程在访问到这个
类时那个初始化块实际已经完成。下面直接return就行了。