java - 关于servlet的线程安全

标签 java multithreading servlets thread-safety

<分区>

Possible Duplicate:
How do servlets work? Instantiation, session variables and multithreading

servlet 是线程安全的吗?例如,如果我打开 5 个不同的浏览器并向容器中的一个 servlet 发送请求,它是否仍然是线程安全的,我特别指的是 service() 方法

最佳答案

您的问题归结为:从同一对象线程安全的多个线程调用方法。答案是:视情况而定。如果您的对象(让它成为 servlet)是无状态的或只有 final 字段,这是完全线程安全的。局部变量和参数是线程局部的(驻留在堆栈上,而不是堆上)。

此外,每个 service() 调用都会收到一个不同的 ServletRequestServletResponse 实例。但是,这是一个不安全的 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 要好得多,因为它使用 CAS CPU 操作是无锁的,而 synchronized 是互斥量。

关于java - 关于servlet的线程安全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11485486/

相关文章:

java - 2d 游戏相机

java - 行为类似于@Entity 和@Embeddable 的类

java - 并发:使用非同步方法更改变量

c++ - 无法与第三方库一起暂停线程

java - 错误页面如何调用asyncContext.complete()?

java - 如何从 jetty 服务器中的 java servlet 发送大型(超过 64k)http 响应?

java - 从 SQS 检索消息缓慢

java - ZK InputElement 名称属性

java - 丢失线程时出现异常

java - 如何正确处理HTTP doPOST和doGet方法?