首页 > 解决方案 > 具有从外部无状态和线程安全传递对象参数的方法的类吗?

问题描述

背景:我正在阅读 Brian Goetz 和其他人(对不起其他人)的“Java Concurrency in Practice”。在我的副本的开头有

@ThreadSafe
public class StatelessFactorizer implements Servlet {

    public void service(ServletRequest req, ServletResponse resp) {
        BigInteger i = extractFromRequest(req);
        BigInteger[] factors = factor(i);
        encodeIntoResponse(resp, factors);
    }
}

(作者的代码示例在这里,但是在书中它看起来就像我在上面添加的那样)

我的问题是:虽然“服务”方法对某些对象有一些外部引用,但它可能会用它做某事,例如改变它的状态。因此,如果 2 个线程同时调用“服务”,则该状态将从 2 个位置修改,并且该类不是线程安全的。人工智能对吗?

我提到的那本书是关于并发的。读者对 HTTP 和/或 Servlet 一无所知。我的书实例甚至没有说明“StatelessFactorizer”实现的“Servlet”是什么。所以它可以是任何东西,所以不能有像“你的方法正在使用不应该影响其他请求的不同对象”这样的假设。我的意思是你不知道 'extractFromRequest(req)' 和 'encodeIntoResponse(resp, factor)' 做什么。当本章讨论无状态时,我假设该章与 Servlet 无关。

标签: javaconcurrencythread-safetystateless

解决方案


基于该req 和 resp 是无状态的

无状态意味着所有请求都是相互独立的,因此每个请求都必须包含足够的信息来完成请求。这意味着基于消息的 HTTP 模型的每个事务都是彼此分开处理的。

您的方法正在使用不应该影响其他请求的不同对象

i派生自获得无状态请求的方法,因此它是无状态的

您可以将类似的逻辑应用于factors

因此service方法是线程安全的


推荐阅读