java - 无状态对象总是线程安全的?

标签 java multithreading concurrency

Java Concurrency In Practice, Section 2.1 ,它指出:

Stateless objects are always thread-safe.

并以下面的类为例:

@ThreadSafe
public class StatelessFactorization implements Servlet {
    public void service(ServletRequest req, ServletResponse resp){
        BigInteger i = extractFromRequest(req);
        BigInteger[] factors = factor(i);
        encodeIntoResponse(resp, factors);       // <-- isn't it possible for resp to be
                                                 //     modified by mult. threads at once?
    }
}

问题:

如上面的代码所示,如​​果多个线程尝试修改同一个 ServletResponse 变量会发生什么情况。

从我对内存分配的理解来看,上面的类似乎并不是完全线程安全的。

虽然对 ServletRequestServletResponse 的引用被放在调用线程的本地堆栈上,但实际对象存储在堆上——这是共享的所有线程。

最佳答案

这里的无状态对象是StatelessFactorization类。它是无状态的,因为它没有自己的状态,即它没有实例字段。因此这个对象是线程安全的。 resp 是另一个实现 ServletResponse 接口(interface)的对象,它可能是也可能不是线程安全的。这里不讨论resp的线程安全。

关于java - 无状态对象总是线程安全的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32815335/

相关文章:

java - 从现有 REST api 生成 Swagger 文档

linq-to-sql - 提交DataContext更改时发生Linq ChangeConflictException

java - 我可以对 subscribeOn 方法和异步任务使用相同的执行器吗

go - 互斥锁用对了吗?

java - 多个线程可以在 Java 中的同一个监视器上持有锁吗?

java - 使用注释注入(inject)替换通过 XML 进行的 Spring bean 注入(inject)

java - 为什么要在 boolean 类和类似的不可变类上使用公共(public)构造函数?

java - Kafka AdminClientConfig 忽略提供的配置

linux - 为什么在中断中使用 mutex_trylock 不安全?

c++ - 错误共享和原子变量