我已经回顾了一个带有节点JS和套接字IO的聊天服务器示例,其示例代码为http://ahoj.io/nodejs-and-websocket-simple-chat-tutorial。在该示例中,服务器使用简单的历史变量来保存聊天记录数据。由于Node Js是单线程,所以每件事情都可以正常工作。 (如果你对节点js不感兴趣,你可以忽略上面的节点JS例子:)我将在下面的java中解释它)带静态字符串的线程安全Servlet
考虑下面的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有很多并发请求和历史字符串总是存储所有消息(所以没有客户端消息丢失或覆盖),并没有出错! 我没有与线程一起工作,所以我想知道我是否在这里失去了一些东西!上述代码是线程安全的并且可以信任。