我已經回顧了一個帶有節點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有很多併發請求和歷史字符串總是存儲所有消息(所以沒有客戶端消息丟失或覆蓋),並沒有出錯! 我沒有與線程一起工作,所以我想知道我是否在這裏失去了一些東西!上述代碼是線程安全的並且可以信任。