【发布时间】:2014-01-13 03:48:00
【问题描述】:
首先我要澄清的是,我知道 Servlet 是单实例多线程模型。容器维护实例并为每个要处理的多个请求创建多个线程,并且所有线程都在同一个 servlet 实例上工作。此外,我们不应该在 servlet 中维护状态,因为它会导致多线程/并发问题。凉爽的!!如果状态(servlet 的成员)本身是线程安全的怎么办?如下例所示
public class MyCrazyServlet extends HttpServlet {
StringBuffer s1 = new StringBuffer("stackoverflow");
static StringBuffer s2 = new StringBuffer("stackexchange");
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String s3 = "I'm safe";
HttpSession crazySession = request.getSession();
//more stuff here
}
}
在上面的 sn-p 中,我假设除了 crazySession 局部变量(HttpSession 实例)之外,其他所有东西(s1、s2 和 s3)都是线程安全的
如果我的理解有误,请指正
【问题讨论】:
-
是的,
StringBuffer是线程安全的。不要与非线程安全的非常相似的类StringBuilder混淆。 -
“一个线程安全的、可变的字符序列。” - docs.oracle.com/javase/7/docs/api/java/lang/StringBuffer.html
-
那么,@DavidWallace 和 Nayuki...s1、s2 和 s3 都是线程安全的,对吧?我正在确认,因为我的导师说只有 s3 是线程安全的
-
StringBuffers 使用时会锁定,因此如果两个线程同时尝试访问它们,其中一个将不得不等待。 -
StringBuffer 保证对对象的多个并发调用一个一个完成,仅此而已。那么你的需求是什么?
标签: java multithreading jakarta-ee servlets thread-safety