在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,我猜這本書的作者想要展示一些接近現實世界的例子。當然,我不能確切地說。 –