我有一个用于显示面包屑中当前位置的类。 这个类是从前端开始为每个用户初始化的。 我的问题是我是否需要同步此类中的方法,如果是,则需要同步的方法。存在一些混淆。所以请告知。
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());
}
}
答案 0 :(得分:2)
这取决于您使用的Web框架,如果对象是按线程创建的,还是作为整个会话的单例。默认情况下,Spring会创建一个实例,并且可能需要同步。其他Web框架可能不会。
请注意,在&#34;快乐路径&#34;世界上,只有一个活动线程为任何给定用户呈现一个页面,但没有什么能阻止用户快速点击不同的链接启动许多连接,因此线程。
答案 1 :(得分:1)
(我在评论中提到这一点,我觉得最好还是回答一下。)
业内有很多网络框架,谁知道他们将如何使用你的课程?最好的方法是测试多个线程是否会同时访问同一个实例。
在班级中维护并发集。每次调用该方法时,将currentThread.thread_id添加到集合中。然后输出该组,看看是否已从多个线程调用它。如果是这样,那么将您的类重写为线程安全的版本。
答案 2 :(得分:1)
跟踪导航通常基于每个用户。此类包含导航状态的存储 - 这是用户特定的状态,因此每个用户会话需要一个实例。除非同一用户可能重新进入Web服务器(如PaulProgrammer所述),否则不需要同步这些方法。
有些框架允许这样做。可以通过设置synchronizeOnSession控制器属性来阻止Spring MVC,并且可能存在类似于其他框架的技术。