在Java Concurrency In Practice, Section 2.1,它指出:无状态对象始终是线程安全的?
无状态的对象始终是线程安全的。
,并给出了下面的类为例:
@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'方法可能会导致不是线程安全的东西。使用原始的(或任何不可变的)参数对我来说会不那么困惑。 – bcorso
@bcorso,我猜这本书的作者想要展示一些接近现实世界的例子。当然,我不能确切地说。 –