gpt4 book ai didi

java - 如果有 happens-before 保证,让 "this"在构造函数的最后一个语句中转义是否安全?

转载 作者:行者123 更新时间:2023-12-05 08:37:13 27 4
gpt4 key购买 nike

常见的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/

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