Java Struts2会话并发问题

Java Struts2会话并发问题,java,concurrency,struts2,Java,Concurrency,Struts2,我有一些麻烦 例如,我有两个动作:第一个和第二个 我已经编写了一个简单的实用程序,它使用executor服务向action First和actions Second发送100000个异步请求 在第一个行动中,我会: HitCounter.increment(); ActionContext.getContext().getSession().put("counter", HitCounter.getAtomicCounter()); return Action.SUCCESS; System.

我有一些麻烦

例如,我有两个动作:第一个和第二个

我已经编写了一个简单的实用程序,它使用executor服务向action First和actions Second发送100000个异步请求

在第一个行动中,我会:

HitCounter.increment();
ActionContext.getContext().getSession().put("counter", HitCounter.getAtomicCounter());
return Action.SUCCESS;
System.out.println("From session: "+ActionContext.getContext().getSession().get("counter"));
System.out.println("Actual:"+ HitCounter.getAtomicCounter());
return Action.SUCCESS;
在第二个行动中,我做到了:

HitCounter.increment();
ActionContext.getContext().getSession().put("counter", HitCounter.getAtomicCounter());
return Action.SUCCESS;
System.out.println("From session: "+ActionContext.getContext().getSession().get("counter"));
System.out.println("Actual:"+ HitCounter.getAtomicCounter());
return Action.SUCCESS;
我看到的结果(这真的让我很生气):

经过一段时间,当我仅从浏览器使用此Fist action/Second action,并且没有并发请求(由我的load实用程序生成)时,结果“稳定”到实际值。因此,我有并发问题

有没有一种标准的方法可以避免Struts2中的并发问题

p.S.HitCounter是线程安全的,因为它只包含一个字段,并且是AtomicInteger

p.p.S.反兑现:

public class HitCounter {
    private static AtomicInteger counter = new AtomicInteger(0);

    public static void increment() {
        counter.incrementAndGet();
    }
    public static int getAtomicCounter() {
        return counter.get();
    }
}

p.p.p.S.I移除螺纹屈服();但这没用(

在第二个操作中没有检索命中计数器

System.out.println(“来自会话:+ActionContext.getContext().getSession().get(“计数器”);


上面的行只是打印对象。代码中是否缺少某些内容?

在第二个操作中,您没有检索命中计数器

System.out.println(“来自会话:+ActionContext.getContext().getSession().get(“计数器”);


上面的一行只是打印对象。代码中是否缺少某些内容?

Struts2操作是线程安全的,因为它们使用线程本地存储…也就是说,存在从变量到值的每个线程映射。因此,没有共享的可变值 状态,无需同步

但是,不能以这种方式处理资源(如会话),因此必须注意并发访问。此问题讨论了以下问题:

根据这一问题: servlet规范声明以下内容是线程安全的:
request.getSession().setAttribute(“foo”,1);

但是请注意,上面的请求是一个HttpServletRequest,它反过来派生了一个HttpSession对象,这个对象不仅仅是Struts2返回的映射……这意味着Struts2版本必须包装,因此可能不符合规范。因此,我们可以实现ServletRequestAware,它为我们提供了一个HttpServletRequest对象fr但是这一行不会像前面的问题所指出的那样对我们有多大帮助,所以实现HttpServletRequest将是一种浪费时间的行为。所有这些都让我想知道Struts2是如何将它为会话返回的映射与不实现映射的HttpSession相协调的它是否有返回映射的方法

因此,让我们考虑一下当前可能发生的……/P>
line1: hitCounter.increment();
line2: ActionContext.getContext().getSession().put("counter", hitCounter.getAtomicCounter());
第1行:我们增加一些全局hitCounter对象

第2a行:我们得到hitCounter对象的副本(返回类型为int)

第2b行:我们在会话中设置hitCounter值

由于HitCounter的线程安全性,我们知道第1行总是很好的…但是第2行呢?我们可以看到有两个部分,如果在获取hitCournter副本和设置HitCounter之间挂起一个线程,将出现竞争条件…从这一点开始执行的最后一个线程将获胜


一种方法是将AtomicInteger放入会话本身,这避免了副本滑入的问题。

Struts2操作是线程安全的,因为它们使用线程本地存储…也就是说,存在从变量到值的每线程映射。因此,不存在共享可变 状态,无需同步

但是,不能以这种方式处理资源(如会话),因此必须注意并发访问。此问题讨论了以下问题:

根据这一问题: servlet规范声明以下内容是线程安全的:
request.getSession().setAttribute(“foo”,1);

但是请注意,上面的请求是一个HttpServletRequest,它反过来派生了一个HttpSession对象,这个对象不仅仅是Struts2返回的映射……这意味着Struts2版本必须包装,因此可能不符合规范。因此,我们可以实现ServletRequestAware,它为我们提供了一个HttpServletRequest对象fr但是这一行不会像前面的问题所指出的那样对我们有多大帮助,所以实现HttpServletRequest将是一种浪费时间的行为。所有这些都让我想知道Struts2是如何将它为会话返回的映射与不实现映射的HttpSession相协调的它是否有返回映射的方法

因此,让我们考虑一下当前可能发生的……/P>
line1: hitCounter.increment();
line2: ActionContext.getContext().getSession().put("counter", hitCounter.getAtomicCounter());
第1行:我们增加一些全局hitCounter对象

第2a行:我们得到hitCounter对象的副本(返回类型为int)

第2b行:我们在会话中设置hitCounter值

由于HitCounter的线程安全性,我们知道第1行总是很好的…但是第2行呢?我们可以看到有两个部分,如果在获取hitCournter副本和设置HitCounter之间挂起一个线程,将出现竞争条件…从这一点开始执行的最后一个线程将获胜


一种方法是将AtomicInteger放入会话本身,这样可以避免副本滑入的问题。

为什么要执行thread.yield()?Struts 2操作默认是线程安全的,我从来没有使用过thread.yield()如果它们是线程安全的,它不会破坏任何东西。问题是-奇怪的结果。是的,奇怪。我不知道为什么会有线程。yield()。我会删除它,看看这是否解决了问题。你能提供HitCounter类吗?收件人:Mohana Rao SV,添加了HitCounter实现。你为什么要做thread.yield()?Struts 2操作在默认情况下是线程安全的,我从来没有这样做过