Spring单例bean的这种设计是线程安全的吗?

2024-01-18

考虑以下 Spring 服务类。 spring定义的作用域是Singleton。在下面的类中自动连接为字段的两个服务 bean 具有相似的结构 - 它们也由以下字段之一组成

  • 春豆本身
  • 无状态类
  • 不可变类

等等。该模式在应用程序设计中总体采用。

@Service     
public class DocumentService {  
  private final DocumentGenerationService documentGenerationService;
  private final DocumentPublishService documentPublishService;

  @Autowired
  public DocumentService (DocumentGenerationService documentGenerationService,    
                          DocumentPublishService documentPublishService) {
  this.documentGenerationService = documentGenerationService;
  this.documentPublishService = documentPublishService;
}

... methods follow

说 DocumentService 类是不可变的,因为不可能改变它的两个字段中的任何一个(它们是只能由容器本身初始化一次的 spring bean),这样说是否正确?

无论如何,上面定义的 DocumentService bean 可以被认为是线程安全的吗?如果遵循这种设计,整个应用程序也是线程安全的吗?


说 DocumentService 类是不可变的,因为不可能改变它的两个字段中的任何一个(它们是只能由容器本身初始化一次的 spring bean),这样说是否正确?

根据不变性的定义 http://en.wikipedia.org/wiki/Immutable_object,正式来说,这个类是不是一成不变的.

如果一个对象的状态不可能改变,那么该对象就是不可变的,并且documentGenerationService and documentPublishService 是班级状态的一部分 DocumentService.

结果,如果班级有always相同的状态,它的行为always一样的方法。换句话说,没有办法改变不可变对象的行为,因为对象的行为仅取决于其状态,而在不可变对象中,该状态永远不会改变(不可变对象的示例是字符串和整数)。

请注意,在不变性的定义中,我们发现一个例外,其中“即使某些属性发生变化,但对象的状态发生变化,对象也被认为是不可变的[以及因此的行为]似乎没有改变 [...]”,但在这种情况下(根据提供的信息),引用状态的变化肯定会改变类的行为(因为我们无法控制它们自己的内部状态)。

有一个strategy http://download.oracle.com/javase/tutorial/essential/concurrency/imstrat.html使一个类不可变。您已经遵循了它的一些准则,但是如果您希望将其做到不可变(我认为情况并非如此),您将需要其他一些准则,例如 make“防御副本”您在构造函数中收到的参数和避免子类重写方法.

This link http://www.javapractices.com/topic/TopicAction.do?Id=29也很有趣。

尽管如此,你不应该使 Spring bean 不可变,因为这不是使用 Spring 提供的编程模型的方式。因此,在这种情况下,类不是不可变的,这是“好事”。

无论如何,上面定义的 DocumentService bean 可以被认为是线程安全的吗?

正如这里所声明的,这个类IS线程安全。许多线程可以安全地访问此类,而不会出现任何竞争条件。我们不能对它包含的字段说同样的话,但这个类是线程安全的。这与“线程安全列表”的工作方式相同:它可以包含“非线程安全”对象,但仍然是“线程安全列表”。

如果遵循这种设计,整个应用程序也是线程安全的吗?

如果系统的所有类都是线程安全的(即没有任何竞争条件出现在任何地方),您可以非正式地说应用程序是线程安全的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Spring单例bean的这种设计是线程安全的吗? 的相关文章

随机推荐

  • 调试适用于 Android 平台的 ionic 应用程序

    我一直在使用离子 我的应用程序使用离子服务工作得很好 然而 一旦我在 android 中启动 apk 它就会出现白色死屏并停留在那里 我可以通过哪些方式调试 Android 平台的 ionic 应用程序 我曾经研究过一些关于调试的知识 并了
  • Linq.Enumerable 中的索引越界

    我在正在处理的服务中间歇性地收到此错误 消息 System IndexOutOfRangeException 索引超出数组范围 在 System Collections Generic List1 Enumerator MoveNext a
  • 为Python编写Sweave

    我最近开始使用Sweave http www stat uni muenchen de leisch Sweave 用于创建使用 R 运行的分析报告 现在我希望对我的 python 脚本执行相同的操作 我找到了参考资料在 Sweave 中嵌
  • 分组算法

    我试图帮助某人编写一个我认为很容易的程序 但当然它从来都不是 我正在尝试制定一个班级名册 通常有 10 20 名学生 并有效地将每个同学与另一个同学有效地唯一配对 以形成独特的小组 因此 一个10人的班级 可以分成9组 它也需要能够处理奇数
  • 来自 java 的 libxml2

    这个问题有点相关用于 Java 中小型 简单文档的最快 XML 解析器 https stackoverflow com questions 530064 fastest xml parser for small simple documen
  • Postgres 生成_系列

    我想要的是对表格进行统计 为此我正在使用generate series 这是我正在做的事情 SELECT x month amount FROM SELECT generate series min date trunc month dat
  • 在 docker 上运行 conda 的 jupyter

    我正在使用 docker 镜像 Continumio anaconda3 并希望通过浏览器使用 conda 启动 jupyter 笔记本服务器 docker run i t p 8888 8888 continuumio anaconda3
  • 在未使用的默认成员初始值设定项中使用仍然是 odr 使用吗?

    即使任何构造函数都没有使用默认成员初始值设定项 在默认成员初始值设定项中使用仍然是 odr 使用吗 例如 这个程序是否格式错误 因为g a 是否使用了 odr 因此其定义被隐式实例化 template a
  • 加密 SQL 数据库中的密码列

    我的数据库名称密码中有一列 我只想在发布到数据库之前对密码进行哈希或加密 我的 php 提交文件中有这样的代码
  • 在 Python 中处理字符串中的转义序列

    有时 当我从文件或用户获取输入时 我会得到一个带有转义序列的字符串 我想处理转义序列与 Python 处理字符串文字中的转义序列的方式相同 https docs python org 3 reference lexical analysis
  • 在 jQuery 中创建新的(永久)CSS 样式

    我想创建一种新样式 而不仅仅是更改元素的样式属性 下面是一些示例代码来演示该问题 Create 1st element var element1 div div text element1 addClass blue body append
  • ASP.NET c# 修复函数库内自定义ConfirmMessagebox 的 OK 事件

    我们创建了一个从 C 通过 javascript 动态显示模态弹出消息的函数 它工作正常 但我们想添加一个参数 以便我们可以传递一个函数委托 或事件处理程序 如果用户按下 确定 按钮 该函数将被调用 有什么建议么 Postdata 我们不需
  • 函数调用之外的星号

    我正在尝试 python 我有一个关于星号的问题 我知道它们用于函数调用中的参数 但我见过在函数卡之外使用它们的代码片段 例如 在 5 个等级的元组中 将它们解压到变量中 例如 first middle last grades 每当我尝试在
  • Chart.js stepSize 不适用于 min

    StepSize 不考虑 min 包括小提琴 https jsfiddle net 4p93aew7 10 https jsfiddle net 4p93aew7 10 var options type line data labels R
  • 在 CSS 中为 div 使用多个 ID

    我的网站上有 3 个 DIV 元素和这个 CSS box left box middle box right a text decoration none color 000000 它似乎只致力于 box right虽然元素 有任何想法吗
  • 将动态内容放入 mail() $message 中

    我只是想整理一封简单的 HTML 电子邮件 以确认我的数据库的订单 我的 message 看起来有点像 message etc etc 我想要在 message HTML 中执行的操作是调用我的数据库 该数据库将返回类似以下内容的行 ema
  • 使用 Facelets 标记文件时出现 FileNotFoundException

    我正在尝试运行 Core JavaServer Faces 书中的示例 ch05 http horstmann com corejsf http horstmann com corejsf 登录后我收到以下消息 sections plane
  • 实现 std::basic_streambuf 子类来操作输入

    我有一个std basic streambuf导致所有输出都以大写形式写入的子类 如下所示 class upper streambuf public std streambuf public upper streambuf std stre
  • 如何从相机拍摄的照片制作缩略图?

    在我的应用程序中 我使用外部相机应用程序来制作照片并将其保存到 SD 卡 我需要这张照片的方形缩略图 我已经设法将相机发送回的缩略图裁剪成正方形 但由于我将照片保存到磁盘 因此意图是空的 而我的旧方法使图片成为正方形Bitmap cropp
  • Spring单例bean的这种设计是线程安全的吗?

    考虑以下 Spring 服务类 spring定义的作用域是Singleton 在下面的类中自动连接为字段的两个服务 bean 具有相似的结构 它们也由以下字段之一组成 春豆本身 无状态类 不可变类 等等 该模式在应用程序设计中总体采用 Se