类中的方法接收来自外部的对象参数,这个类是无状态的并且线程安全的吗?

10 浏览
0 Comments

类中的方法接收来自外部的对象参数,这个类是无状态的并且线程安全的吗?

我正在阅读Brian Goetz等人编写的《Java并发实践》(抱歉其他人)。在我的副本开头有以下代码示例:\n

@ThreadSafe
public class StatelessFactorizer implements Servlet {
    public void service(ServletRequest req, ServletResponse resp) {
        BigInteger i = extractFromRequest(req);
        BigInteger[] factors = factor(i);
        encodeIntoResponse(resp, factors);
    }
}

\n(作者的代码示例在这里,但在书中是我上面添加的)\n我的问题是:虽然“service”方法对一些对象具有外部引用,它可能会对其进行一些操作,例如更改其状态。因此,如果两个线程同时调用“service”方法,该状态将从两个位置进行修改,该类就不是线程安全的。我是对的吗?\n我提到的这本书是关于并发的,读者可能对HTTP和/或Servlet一无所知。我的这本书甚至没有说明“Servlet”是什么,“StatelessFactorizer”实现了什么。因此,它可以是任何东西,不可能做出“您的方法正在使用不同的对象,不应该影响其他请求”的假设。我的意思是,您不知道“extractFromRequest(req)”和“encodeIntoResponse(resp, factors)”是做什么的。由于本章讨论的是无状态,我假设本章与Servlet无关。

0
0 Comments

根据上述内容,我们可以看出这个问题的出现原因是关于类和方法的状态性和线程安全性的讨论。

文章中提到了请求和响应是无状态的,即每个请求都是独立的,每个请求都必须包含足够的信息来完成请求。这意味着HTTP的每个消息事务都是独立处理的。

文章还提到了方法使用的对象是不同的,不会影响其他请求。根据这个逻辑,方法中的对象是无状态的。对于factors也可以应用类似的逻辑。因此,service方法是线程安全的。

然而,问题提出了一个质疑,即不能假设“你的方法使用的对象是不同的,不会影响其他请求”。这引发了关于类描述的讨论,即这个类是否是无状态的servlet。

通过上述讨论,我们可以得出这个问题的出现原因是对类和方法状态性和线程安全性的讨论。解决这个问题的方法可能是通过检查类的描述来确定是否是无状态的servlet,或者在代码中使用适当的同步机制来确保线程安全性。

0