关于singleton的问题,它只在一个会话中有效????

03-08-30 testu
我写了一个SINGLETON的类,然后在JSP里使用它,我发现
它并没有真正的是一个单例,比如在1.jsp中使用它,当我
不停的刷新本页时,它却是只被创建了一次,也就是在第一次
访问1.jsp时候被创建了,以后不论怎么刷新1.jsp,都不会再创建,
但是当我打开一个新窗口时,再访问1.jsp,发现它又被创建了一次。

后来,我写了一个SERVLET,在它里面创建这个SINGLETON类的实例,
然后把这个SERVLET在web.xml里设置为onload 1,这时,不论我开
多少个IE,去访问1.jsp,这个类都不会被再次创建

请问,为什么会出现这种情况?????

testu
2003-08-30 15:38
我再说清楚一点,我不是说在JSP创建STINGLETON,
我的意思是,我写了一个SINGGLETON的类,在JSP里调用,如:

public class Myone
{
	private static final Myone m_instance = new Myone();

	private int counters = 0;

    private Myone() { counters=0; }

    public static Myone getInstance() {
        return m_instance;
    }
    ........
}

在其他的JAVABEAN中,使用Myone,比如:
public class other
{
.......
    public void init()
    {
        Myone one=Myone.getInstance();
        .....
     }
}

然后在1.jsp中,如果我写:
<%
other obj=new other();
obj.init();
......
%>
<p class="indent">

那么,当我访问1.jsp的时候,就会建立这个单例类Myone,
而且不论我刷新1.jsp多少次,Myone只有一个。
但是如果我新开一个IE,重新访问1.jsp,这时就会创建一个
新的Myone,而不是刚才那个已经创建好的。
我的问题是:
既然是单例类,为什么还会被创建多次那?

KillerMan
2003-08-31 11:50
public static Myone getInstance() { return m_instance; }

改成

if(m_instance == null){
return new Myone();
}else{
return m_instance
}

再,不要在声明m_instance属性的时候对其初始化

testu
2003-09-01 09:17
你错了,不用象你写的那样改,
而且应该在声明m_instance属性的时候对其初始化!!!

否则对getInstance函数还要加上同步原语