在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
变量会发生什么情况。
从我对内存分配的理解来看,上面的类似乎并不是完全线程安全的。
虽然对 ServletRequest
和 ServletResponse
的引用被放在调用线程的本地堆栈上,但实际对象存储在堆上——这是共享的所有线程。
最佳答案
这里的无状态对象是StatelessFactorization
类。它是无状态的,因为它没有自己的状态,即它没有实例字段。因此这个对象是线程安全的。 resp
是另一个实现 ServletResponse
接口(interface)的对象,它可能是也可能不是线程安全的。这里不讨论resp
的线程安全。
关于java - 无状态对象总是线程安全的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32815335/