CDI PostConstruct 和易失性字段

2024-02-03

当我们想要有条件地初始化 bean 的某些字段时,使用后构造方法,我们是否需要关心字段的波动性,因为它是多线程环境?

比如说,我们有这样的东西:

@ApplicationScoped
public class FooService {

    private final ConfigurationService configurationService;

    private FooBean fooBean;

    @Inject
    FooService(ConfigurationService configurationService) {
         this.configurationService = configurationService;
    }

    void init(@Observes @Initialized(ApplicationScoped.class) Object ignored) {
        if (configurationService.isFooBeanInitialisationEnabled()) {
             fooBean = initialiseFooBean(configurationService); // some initialisation
        }
    }

    void cleanup(@Observes @Destroyed(ApplicationScoped.class) Object ignored) {
       if (fooBean != null) {
           fooBean.cleanup();
       }
    }
}

所以应该fooBean比方说,被包裹在AtomicReference或成为volatile或者这将是多余的额外保护?

P.S.在这种特殊情况下,它可以重新表述为:构建后事件和销毁后事件是否由同一线程执行?不过,我想得到一个更一般情况的答案。


我想说这取决于哪个线程实际启动和销毁上下文。 如果您使用常规事件,它们是同步的(异步事件已在 CDI 2.0 中添加)ObservesAsync, see Java EE 8:使用 ManagedExecutorService 发送异步 CDI 2.0 事件 http://www.adam-bien.com/roller/abien/entry/java_ee_8_sending_asynchronous),因此它们在与调用者相同的线程中被调用。

一般来说,我不认为使用相同的线程(在应用程序服务器或独立应用程序中),所以我建议使用volatile确保看到正确的值(基本上是在销毁线程上看到的构造值)。然而,以并发方式启动和销毁应用程序并不是一个经常发生的用例......

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

CDI PostConstruct 和易失性字段 的相关文章

随机推荐

  • Protobuf.net 列表的对象图序列化

    据我了解 protobuf net 的列表不支持 AsReference 因此我尝试解决此限制 我创建了一个名为 SuperList 的自定义列表 其中包含包装在 SuperListItem 类型的对象中的项目 如下所示 ProtoCont
  • Shinyapp 无法像本地一样在shinyapps.io 上运行

    我正在开发 R Shiny 应用程序 最初 我将数据集加载到内存中 并根据用户的输入日期对其进行切片 例如 我下载了过去 90 天的观察结果 如果用户选择以图表形式查看过去 20 天 我仅更新图表用于计算的数据帧切片 我试图通过查找该日期的
  • 在 Visual Studio 2010 中为远程 Sharepoint 2010 服务器进行开发

    据我所知 您无法在 Visual Studio 2010 中为远程 Sharepoint 2010 服务器进行开发 因为您需要在您的机器上运行本地副本 我知道有一个黑客 在我的情况下 我在本地安装了 Sharepoint Foundatio
  • 如何将 ORACLE DB 中大约 300 个表的数据导出到 csv 或 txt 文件

    是否有可能使用任何 PL SQL 过程将包含数百万条记录的单个模式中的大约 300 个表中的数据导出到 CSV 或 TXT 您有什么建议 哪种方法最快 目前我不需要将这些导出的文件导入到任何其他模式 我尝试使用 Toad 手动逐表导出 我创
  • 模态视图的导航栏位置 - iOS7

    在导航控制器中 您可以按预期自动获取导航栏的正确颜色和位置 像这样 但在模式视图中 当您拖动导航栏时 您可以将其放置在顶部 这与运营商 电池信息太接近 因此 您可以将其向下拖动 猜测它与自动创建的位置匹配的程度 但随后就会出现颜色差异 我尝
  • 带下划线的 Maven 原型文件名模式

    我正在创建一个 Maven 原型 我想生成类似的文件project todo messages properties with todo由过滤属性替换 我创建了一个文件project todo messages properties和一个过
  • .NET Url 重写根 url

    我在 IIS7 中有以下规则
  • 如何将 git commit hash 分配给 Jenkins 文件中的变量

    我正在尝试将 git commit hash 分配给 Jenkins 管道中定义的变量 如下所示 GIT COMMIT HASH sh git log n 1 pretty format H 这将在 Jenkins 构建日志中打印提交哈希
  • 如何修复“Gradle 构建无法生成 Android 捆绑包”。在颤振中

    跑步时flutter build appbundle我收到以下错误 Gradle 构建无法生成 Android 捆绑包 当在详细模式下运行时 这是我另外得到的 0 throwToolExit package flutter tools sr
  • 有没有办法判断SMM中断发生了?

    对于某些以编程方式定义的间隔 有没有办法确定SMM https en wikipedia org wiki System Management Mode当前核心上是否发生了条目 从 Nehalem 开始 MSR 寄存器 0x 34 称为MS
  • PHP PDO sqlite:无法打开数据库

    我使用 sqlite 在 php 中开发一个 web 应用程序 将数据存储在数据库中 正如在互联网上看到的 我使用 PDO 而不是 SQLITE3 类 我执行了互联网上显示的所有步骤来避免此错误消息 但它仍然出现 SQLSTATE HY00
  • 在 JBoss AS7 独立部署中加载第 3 方 JAR 的最佳实践?

    在 JBoss as 7 0 x 独立部署中加载第 3 方 JAR 的最佳实践是什么 我努力了 将每个 JAR 部署为具有自己的 module xml 描述符的独立模块 将 JAR 部署到 WAR 的 WEB INF lib 目录中 以及在
  • 整个表格变化

    我该如何使用change或所有人的类似活动form元素 我不想使用change分别为每个字段 您可以使用change事件于form元素 const form document querySelector form form addEvent
  • 如何在 JavaScript 中输出 ISO 8601 格式的字符串?

    我有一个Date目的 我如何渲染title以下片段的一部分
  • Python如何从变量的argparse中获取值,而不是变量的名称?

    如果我执行 args svc name 我期望等于 args option1 因为 svc name 的值是 option1 但我收到错误 命名空间 对象没有属性 svc name parser argparse ArgumentParse
  • 在图形 api 中使用 GUID 获取共享点列表项

    我们需要将文档上传到 SharePoint Online 列表 然后向文档添加一些可搜索属性 我们正在使用 Microsoft Graph 上传文档 由于我们需要能够根据不同的条件搜索文档 因此我们将文档上传到列表中 这是请求的快照 str
  • 如何为 MathJax 转义双反斜杠?

    我通过添加以下代码来使 MathJax 与 WordPress 一起使用footer php 它适用于简单的数学符号和方程
  • 导入weka.jar文件

    我是佐治亚州亚特兰大当地一所大学的学生 我正在寻找将 Weka jar 文件合并到我的班级项目的 Eclipse 中 我已经多次尝试使用 Eclipse 将 weka 3 4 jar 文件合并到 java 项目中的 java 构建路径中 每
  • 如何将数据框堆叠在一起(Pandas、Python3)

    假设我有 3 个 Pandas DF DF1 Words Score The Man 2 The Girl 4 Df2 Words2 Score2 The Boy 6 The Mother 7 Df3 Words3 Score3 The S
  • CDI PostConstruct 和易失性字段

    当我们想要有条件地初始化 bean 的某些字段时 使用后构造方法 我们是否需要关心字段的波动性 因为它是多线程环境 比如说 我们有这样的东西 ApplicationScoped public class FooService private