struts2的多线程访问问题(特定参数下只能串行访问action)

以前一直都是理所当然的认为浏览器发起一个请求到后台action,肯定是创建一个新线程并创建一个新类来为这个请求服务,其中的想法也比较混乱却没有理会。

直到近期遇到了一个新的需求要做高并发的时候抢购一个物品,就想怎么样给action加一个synchronized同步一下,这时候问题就来了!

1.action收到请求后是用同一个线程进行提供服务呢还是每次都新建一个线程?

2.web服务器收到请求后是新建一个action实例对象还是用单例模式?

3.如何控制每次只能一个用户访问特定参数下的该action?

为了探究这些问题,先做了一个例子(用的是SSH),回答了前2个问题

1.action收到同一浏览器的访问时会新建一个线程,之后每次都用该线程进行该浏览器访问的处理。

2.无论是不是同一浏览器的请求,服务器会在收到请求后新建action对象

struts2的多线程访问问题(特定参数下只能串行访问action)_第1张图片

对于第三个问题就比较难办些了。

之前接触的多线程同步的内容比较少,第一想到的是synchronized的,于是就百度下synchronized用法,写了个例子

struts2的多线程访问问题(特定参数下只能串行访问action)_第2张图片

很奇怪,明明用了同步了,却没有达到同步的效果。于是再去百度

synchronized的参数必须是同一个对象实例才能进行同步,很显然我们这里是没有一个根据参数值变而新建的对象的,那该怎么办呢?

好头大,搜索了好久都没有找到解决方案,先记录先,找到答案后再来编辑!

----------------------------------------------------------------------------------------------------------------------

在网上找了好久,发现给出的方案只有一个,就是使用synchronized (str.intern())

总是觉得str.intern()有点不靠谱,但是又没有更好的办法,目前只好使用该方法来完成业务代码的编写了!


你可能感兴趣的:(struts2,struts,struts2.0,java,ssh,并发)