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


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

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

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

SINGLETON怎么在Jsp中创建?

可能是我没说清楚,我不是说在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();
......
%>

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

这个可能是实例的生存周期问题,具体还得看Servlet容器的处理了。

你是如何得知singleton对象又被创建一次呢?

这太简单了,随便什么办法都可以

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

我写了个测试,并没有发现你说的情况。代码如下:

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>

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

我写了个测试,并没有发现你说的情况。代码如下:

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>

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