您的问题可以归结为: 正在从同一对象线程safe上的多个线程调用方法 。答案是: 取决于
。如果您的对象(让它成为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;}或
AtomicInteger:
private AtomicInteger counter = new AtomicInteger();//...counter.incrementAndGet();
在这种特殊情况下
AtomicInteger会更好,因为它是
synchronized互斥锁时可以使用CAS CPU操作无锁。



