Ajax轮询 线程安全问题

我现在的项目设计是,struts1。x交给spring管理,前台有一个Ajax轮询,每一分钟请求一次(dpnm.do),在action中调用了数据获取的类,这个类里有一个List成员变量,每次的Ajax结果会放到这个list里面,然后将这个list转换为json返回给客户端,客户端用flash显示这条曲线,现在的问题是:
1.将spring的scope设置成prototype的话,每次都去new一个action,一是太浪费了,二来List的数据没法获取(除非使用static的List,那这样多线程就更麻烦了)
2.如果使用action的单粒,在多线程的情况下,List数据有线程安全问题
下面给一些代码:
Action的代码,Ajax请求就是调用这个Action


//该成员变量中有一个成员变量List
private PowerManager manager;
@Override
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
throws Exception {
String nodeIP = request.getParameter(
"nodeIP");
response.getWriter().write(manager.getNodePowerStats(nodeIP));
return null;
}
public void setManager(PowerManager manager) {
this.manager = manager;
}

真正的业务类

//成员变量数组
List nodePowerStats = new ArrayList();
public String formatNodePowerResponse(String response,String nodeIp) throws JSONException{
//省略部分代码..................
//返回json
return new JSONObject().put(
"nodePowerStat",nodePowerStats).toString();

我现在能想到避免多线程的方法是讲数据放到前端,由浏览器来负责,我不知道有谁有什么好的办法,在后台实现了!谢谢

2010年07月14日 09:00 "janwen"的内容
我不知道有谁有什么好的办法,在后台实现了 ...

不知你想达到什么目标?担心使用action单例有线程问题,那也可以解决啊,比如引入不变性,或加锁,不过都是read操作应该没有多线程问题。

关键是轮询啊,后台一直在在发送请求至action,每次Ajax请求后的结果都要保存到一个数组,如果多个人同时发送这个请求过来,数组的数据就有现成安全问题了,在action里调用的类有一个成员变量List,每次结果都放在那里面了!如果每次都new action的话,List就只能用static的了,线程安全问题更严重了!不知道我说明白了没有!Action里调用的代码片段如下:


//成员变量数组
List nodePowerStats = new ArrayList();
public String formatNodePowerResponse(String response,String nodeIp) throws JSONException{
//省略部分代码..................
//返回json
return new JSONObject().put(
"nodePowerStat",nodePowerStats).toString();

List改成static,读写加锁,很简单明了的处理方式,不明白哪里复杂,哪里线程安全更严重...
请赐教

关键不是枷锁的问题,关键是每个用户返回的查询结果都是那个list,再加上Ajax轮询,spring的单粒,list返回给用户的都是多个用户修改后的结果,不知道我解释明白了没,你最好好想想Ajax轮询的后果

能否回答一下,为什么一定要把list放在成员变量中?如果必须要放,那你遇到的问题是不可避免的。解决方案也就能如上所说了。如果可以不放,你每次都通过方法的参数来传递list也能解决你的问题。

正如bang所说的,引入不变性就可以解决了
1:action单例
2:list引入不变性