java - 具有从外部无状态和线程安全传递对象参数的方法的类吗?
问题描述
背景:我正在阅读 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 无关。
解决方案
无状态意味着所有请求都是相互独立的,因此每个请求都必须包含足够的信息来完成请求。这意味着基于消息的 HTTP 模型的每个事务都是彼此分开处理的。
您的方法正在使用不应该影响其他请求的不同对象
i
派生自获得无状态请求的方法,因此它是无状态的
您可以将类似的逻辑应用于factors
因此service
方法是线程安全的
推荐阅读
- c - cnd_broadcast 只唤醒在广播前等待的线程
- c# - 如何创建一个 .NET Web 服务器来接收具有任意长段的 URL?
- mongodb - 如何在pymongo中将YY格式转换为YYYY格式
- git - Git-如何从 master 刷新功能分支
- node.js - 如何修改 AWS Cognito JWT Tokens,我们正在使用 NodeJS 技术问题
- python-3.x - Pytest 因相对导入而失败
- youtube - 是否可以在“if-modified”标头上发送 ETag,以查看是否已将新视频添加到频道或播放列表中?
- php - 如何通过 PHP 中的 webhook 接收 XML 数据?
- python - 列表中的矩阵代码如何工作?
- .net - Marshal.GetLastWin32Error() 不返回错误