java - 如果有 happens-before 保证,让 "this"在构造函数的最后一个语句中

常见的advice在 Java 中是不要让“this”引用在构造对象期间逃逸,因此不要在构造函数中启动任何线程。但是我发现自己编写了很多应该使用执行程序启动线程的类。根据常见的建议,我应该额外编写一个 start() 方法来将任务提交给执行程序。

但是将任务提交给执行者会提供发生前的保证,如文档所述here .那么在构造函数的最后一个语句中提交任务就可以了吗?或者更一般的问题:如果构造函数的最后一个语句提供 happens-before 保证,让“this”转义是否安全?

最佳答案

Answer by Stefan Feuerhahn是正确的。

我将添加一个建议,即在执行工作的类中嵌入执行程序服务可能会产生“代码味道”,表明设计薄弱。

一般我们要关注single responsibility principle在我们的设计中。一个类应该有一个单一的目的,并且应该尽量不要偏离那个狭窄的特定目的。

例如,如果编写一个类来创建报告,则该类应该只知道该报告。该类不应该知道何时应该运行该报告,或者多久运行一次报告,或者如果报告已经运行,其他代码关心什么。

这种报告运行时间的安排与应用程序的生命周期相关。一件重要的事情是,当不再需要或应用程序退出时,执行程序服务最终必须关闭。否则后台线程池可能会像僵尸?一样无限期地继续下去。您的报告生成类不应该知道何时不再需要它,也不应该知道应用程序何时或为何退出。

问题的另一个方面是配置执行程序服务涉及了解部署方案。多少 RAM,多少 CPU 内核,主机上有多少其他负担,所有这些都有助于决定如何设置执行程序服务。您的报告生成代码不应因部署情况的变化而改变。

报告生成类不应该知道调用应用程序的生命周期,也不知道执行者服务。生成报告的应用程序应该只知道如何生成该报告。您代码中的其他一些地方,可能是某个报表管理器类或您应用程序的生命周期编排代码,应该处理运行报表的频率和时间。

关于java - 如果有 happens-before 保证,让 "this"在构造函数的最后一个语句中转义是否安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66142273/

相关文章:

javascript - React App - 我的警告窗口出现两次

python - 将 seq2seq NLP 模型转换为 ONNX 格式会对其性能产生负面影响吗?

c++ - 自动类型检测是否只查看一个语句

c# - 如何使用 C# 连接到 Azure 存储表

java - 输出最大分数

javascript - 使用路由器 "No overload matches this call"

python - 条件运算符不匹配

ajax - ASP.NET Core Razor ajax POST 请求数据对象为空

swift - 如何使用 SwiftUI 中的扩展将 Hashable 协议(protocol)添加

flutter - 调用者没有执行指定操作的权限