Web应用程序中的多线程

时间:2015-01-15 23:08:02

标签: java multithreading web

我有一个用于显示面包屑中当前位置的类。 这个类是从前端开始为每个用户初始化的。 我的问题是我是否需要同步此类中的方法,如果是,则需要同步的方法。存在一些混淆。所以请告知。

public class CrumbNav {

    private Stack<Crumb> stack;
    private Crumb crumb;

    public CrumbNav() {
        stack = new Stack<Crumb>();
        crumb = new Crumb("Home");
        stack.push(crumb);
    }


    public void addcrumb(String current) {          
        Crumb newCrumb = new Crumb(current);
        if (stack.peek().equals(newCrumb)) {
            return;
        }
        stack.push(newCrumb);
    }

    public void removeCurrent() {
        stack.pop();
    }

    public void eraseTrail() {
        stack.clear();
        stack.push(crumb);
    }

    public void removeCrumbsClicked(Crumb selected) {
        while (true) {
            if (stack.peek().equals(selected) || stack.isEmpty())
                break;

            stack.pop();
        }
    }

    public Crumb getLastBreadCrumb() {
        return stack.lastElement();
    }

    public Crumb getPreviousCrumb() {
        if (stack.size() > 1) {
            return stack.get(stack.size() - 2);
        }
        return null;
    }

    public List<Crumb> getCrumbTrail() {
        return stack.subList(0, stack.size());
    }
}

3 个答案:

答案 0 :(得分:2)

这取决于您使用的Web框架,如果对象是按线程创建的,还是作为整个会话的单例。默认情况下,Spring会创建一个实例,并且可能需要同步。其他Web框架可能不会。

请注意,在&#34;快乐路径&#34;世界上,只有一个活动线程为任何给定用户呈现一个页面,但没有什么能阻止用户快速点击不同的链接启动许多连接,因此线程。

答案 1 :(得分:1)

(我在评论中提到这一点,我觉得最好还是回答一下。)

业内有很多网络框架,谁知道他们将如何使用你的课程?最好的方法是测试多个线程是否会同时访问同一个实例。

在班级中维护并发集。每次调用该方法时,将currentThread.thread_id添加到集合中。然后输出该组,看看是否已从多个线程调用它。如果是这样,那么将您的类重写为线程安全的版本。

答案 2 :(得分:1)

跟踪导航通常基于每个用户。此类包含导航状态的存储 - 这是用户特定的状态,因此每个用户会话需要一个实例。除非同一用户可能重新进入Web服务器(如PaulProgrammer所述),否则不需要同步这些方法。

有些框架允许这样做。可以通过设置synchronizeOnSession控制器属性来阻止Spring MVC,并且可能存在类似于其他框架的技术。