【发布时间】:2014-06-22 18:44:08
【问题描述】:
我在网站上看到了一个servlet示例代码,据说这个代码是线程不安全的,但是我不知道为什么它是线程不安全的,当我使用这个代码时会发生什么。这个代码是一个servlet代码,用于保存每位访客的姓名。
public class UnsafeGuestbookServlet extends HttpServlet {
private Set visitorSet = new HashSet();
protected void doGet(HttpServletRequest httpServletRequest,
HttpServletResponse httpServletResponse) throws ServletException, IOException {
String visitorName = httpServletRequest.getParameter("NAME");
if (visitorName != null)
visitorSet.add(visitorName);
}
}
人们说如果我像这样更改代码:
private Set visitorSet = Collections.synchronizedSet(new HashSet());
线程不安全问题将得到解决。
我知道如果这段代码是线程不安全的,肯定是visitorSet造成的,它是一个共享数据结构。由于String visitorName是一个局部变量,所以每个线程都会在自己的调用栈中进行复制,对吧?
【问题讨论】:
标签: java servlets thread-safety