【发布时间】:2015-07-12 10:07:08
【问题描述】:
我在http://ahoj.io/nodejs-and-websocket-simple-chat-tutorial 上查看了一个带有 Node JS 和套接字 IO 的聊天服务器示例。在该示例中,服务器使用了一个简单的历史变量来保存聊天历史数据。由于 Node Js 是单线程的,所以一切正常。 (如果你对 node js 不感兴趣,可以忽略上面的 node JS 示例:)我将在下面用 java 解释)
考虑下面的 servlet,它从请求中获取 message 字符串并将其添加到字符串中。此代码可能是聊天服务器的示例。它从请求中获取用户消息并将其全部发送到history 字符串,其他客户端可以读取它。
public class ChatServlet implements Servlet {
private static String history = "";
public void service(ServletRequest request, ServletResponse response)
history = history.concat(request.getParameter("message"));
}
}
理论上,此代码不是线程安全的,因为它使用了 global static 变量 (How do servlets work? Instantiation, sessions, shared variables and multithreading) 。
但是,我已经使用 jMeter 测试了上面的代码,其中包含大量并发请求,并且历史字符串始终存储所有消息(因此没有客户端消息丢失或覆盖),并且没有出错! 我没有使用线程,所以我想知道我是否在这里遗漏了什么!上面的代码是线程安全的,是否可信。
【问题讨论】:
标签: java node.js multithreading servlets thread-safety