<分区>
Possible Duplicate:
How do servlets work? Instantiation, session variables and multithreading
servlet 是线程安全的吗?例如,如果我打开 5 个不同的浏览器并向容器中的一个 servlet 发送请求,它是否仍然是线程安全的,我特别指的是 service()
方法
<分区>
Possible Duplicate:
How do servlets work? Instantiation, session variables and multithreading
servlet 是线程安全的吗?例如,如果我打开 5 个不同的浏览器并向容器中的一个 servlet 发送请求,它是否仍然是线程安全的,我特别指的是 service()
方法
最佳答案
您的问题归结为:从同一对象线程安全的多个线程调用方法。答案是:视情况而定。如果您的对象(让它成为 servlet)是无状态的或只有 final
字段,这是完全线程安全的。局部变量和参数是线程局部的(驻留在堆栈上,而不是堆上)。
此外,每个 service()
调用都会收到一个不同的 ServletRequest
和 ServletResponse
实例。但是,这是一个不安全的 servlet 示例:
public class UnsafeServlet implements Servlet {
private int counter;
public void init(ServletConfig config) throws ServletException {
}
public void service(ServletRequest request, ServletResponse response)
++counter;
}
public void destroy() {
}
}
由于多个线程可以访问 counter
变量,因此必须以某种方式对其进行保护:要么使用 synchronized
(volatile
是不够的) :
synchronized(this) {
++counter;
}
private AtomicInteger counter = new AtomicInteger();
//...
counter.incrementAndGet();
在这种特殊情况下,AtomicInteger
要好得多,因为它使用 CAS CPU 操作是无锁的,而 synchronized
是互斥量。
关于java - 关于servlet的线程安全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11485486/