关于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,这个类都不会被再次创建

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

banq
2003-08-30 14:08
SINGLETON怎么在Jsp中创建?

testu
2003-08-30 15:36
可能是我没说清楚,我不是说在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,而不是刚才那个已经创建好的。
我的问题是:
既然是单例类,为什么还会被创建多次那?

photonman
2003-08-30 20:59
这个可能是实例的生存周期问题,具体还得看Servlet容器的处理了。

banq
2003-08-31 18:42
你是如何得知singleton对象又被创建一次呢?

testu
2003-09-01 09:15
这太简单了,随便什么办法都可以

我的SINGLETON类里有一个BOOLEAN变量:hasValuse,
初始状态是false,在SINGLETON类里有一个方法:
public String[] getCodes()
{
if(hasValuse) return 一个数组;
......
hasValuse=true;
}
调用这个方法,如果是SINGLETON第一被创建,则这个变量
为false,就会执行getCodes中:
if(hasValuse) return 一个数组;
这一句下面的代码,否则就不会,
我只要在这句下面写一个System.out就可以知道这个
singleton类是不是第一被创建了。

bfh365
2003-09-01 12:51
我写了个测试,并没有发现你说的情况。代码如下:

Single.java
---------------------
package test;

public class Single {
public static Single instance = null;

private Single() {
}

public static Single getInstance() {
if (instance==null) {
System.out.println("新建了一个");
instance = new Single();
return instance;
}else{
System.out.println("用原来的");
return instance;
}
}

}

jsp1.jsp
------------------------------------
<%@ page contentType="text/html; charset=GBK" %>
<%@ page import="test.*"%>
<html>
<head>
<title>
jsp1
</title>
</head>
<body bgcolor="ffffff">
<h1>
<%Single.getInstance();%>
</h1>
</body>
</html>

以上测试代码的输出,可以通过查看应用服务器的后台输出。
第一次运行时输出:“新建了一个”
以后的输出都是:“用原来的”。即使打开新的窗口,也是如此

bfh365
2003-09-01 12:54
我写了个测试,并没有发现你说的情况。代码如下:

Single.java
---------------------
package test;

public class Single {
public static Single instance = null;

private Single() {
}

public static Single getInstance() {
if (instance==null) {
System.out.println("新建了一个");
instance = new Single();
return instance;
}else{
System.out.println("用原来的");
return instance;
}
}

}

jsp1.jsp
------------------------------------

<%@ page contentType="text/html; charset=GBK" %>
<%@ page import="test.*"%>
<html>
<head>
<title>
jsp1
</title>
</head>
<body bgcolor="ffffff">
<h1>
<%Single.getInstance();%>
</h1>
</body>
</html>

<p class="indent">


以上测试代码的输出,可以通过查看应用服务器的后台输出。
第一次运行时输出:“新建了一个”
以后的输出都是:“用原来的”。即使打开新的窗口,也是如此