首页 > 解决方案 > Spring bean 字段线程安全

问题描述

我创建了一个 spring 库,其中有一个调度程序,它从 config-server 获取配置并将其注入到 bean 的字段中。参考下图:

在此处输入图像描述

问题是,在重负载下,可能会出现线程并发问题。我应该如何防止这种情况?

一些代码:

这是用户提供配置密钥的方式

    @AutoConfig("user")
data class ConfigurationWithPrefix (

    @ConfigValue("role")
    val role: String = ""
)

@AutoConfig
data class ConfigurationWithoutPrefix (

    @ConfigValue("user.role")
    val role: String = ""
)

@AutoConfig注释将使此类成为一个bean。 然后我通过注释获取 bean@AutoConfig并将值插入到@ConfigValue键中。


field.set(
          bean,
          valueFromConfig
 )

这个过程发生在不同的线程上,所以在插入字段值时如果我的代码尝试访问字段并发问题会出现,如何防止它?

标签: javaspringkotlinconcurrencyspring-bean

解决方案


这类似于多线程缓存读/写,因为这种问题 AtomicReference 工作得更好,其语义类似于 volatile 没有同步。

https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/package-summary.html

Bean 定义可以转换为:

data class ConfigurationWithPrefix (

    @ConfigValue("role")
    val role: AtomicReference<String> = AtomicReference("")
)

@AutoConfig
data class ConfigurationWithoutPrefix (

    @ConfigValue("user.role")
    val role: AtomicReference<String> = AtomicReference("")
)

推荐阅读