我看到一个来自网站的servlet示例代码,这段代码据说是线程不安全的,但是我不能说出为什么它是线程不安全的,当我使用这段代码时会发生什么。这段代码是一个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);
}
}
Peoper说,如果我改变这样的代码:
private Set visitorSet = Collections.synchronizedSet(new HashSet());
线程安全的问题将得到解决。
我知道如果这段代码是线程不安全的,它必须由visitorSet引起,它是一个共享数据结构。由于字符串visitorName是一个局部变量,每个线程都会在它自己的调用堆栈中创建一个副本,对?
为什么对不安全的HashSet进行简单的添加操作可能会导致一些问题?请给我一个例子吗? – wuchang
那么现在你问的是线程和同步的问题。我正在编辑我的答案,在此包含更多信息 – Kris