gpt4 book ai didi

java - 这种 Spring 单例 bean 线程的设计是否安全?

转载 作者:IT老高 更新时间:2023-10-28 13:47:35 25 4
gpt4 key购买 nike

考虑以下 Spring Service 类。定义的 Spring 范围是单例。自动连接为以下类中的字段的两个服务 bean 具有相似的结构 - 它们也由以下任一字段组成

  • Spring 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 可以被认为是线程安全的吗?如果遵循这种设计,整个应用程序也是线程安全的吗?

最佳答案

Is it correct to say that the DocumentService class is immutable since it's not possible to mutate any of its two fields (which are spring beans that can be initialized only once by the container itself)?

根据definition of immutability ,并且正式地说,这个类不是不可变的

如果不能改变对象的状态,则对象是不可变的,documentGenerationServicedocumentPublishService的状态是状态的一部分类 DocumentService

因此,如果类具有总是相同的状态,它的行为总是相同。换句话说,没有办法改变不可变对象(immutable对象)的行为,因为对象的行为仅取决于其状态,而在不可变对象(immutable对象)中,此状态永远不会改变(不可变对象(immutable对象)的示例是字符串和整数)。

请注意,在不可变性的定义中,我们发现了一个异常(exception):“即使某些 [...] 属性发生了变化,但对象的状态发生了变化,但对象的状态也发生了变化,但对象被认为是不可变的 [因此,行为] < em>似乎是不变的[...]”,但在这种情况下(根据提供的信息)引用状态的变化肯定会改变类的行为(因为我们没有对其内部状态的任何控制)。

有一个 strategy 使类不可变。你已经遵循了它的一些指导方针,但如果你希望它不可变(我认为不是这样),你需要一些其他的,比如制作你收到的参数的 “防御性副本”在构造函数中并避免子类覆盖方法

这个 link也很有趣。

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

In any case, can the DocumentService bean as defined above be considered thread-safe?

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

And if this design is followed the application as a whole is thread-safe too?

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

关于java - 这种 Spring 单例 bean 线程的设计是否安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6419393/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com