【发布时间】:2021-01-19 03:01:25
【问题描述】:
我创建了一个 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。
然后我通过 @AutoConfig 注释获取 bean 并将值插入到 @ConfigValue 键中。
field.set(
bean,
valueFromConfig
)
这个过程发生在另一个线程上,所以在插入字段值时如果我的代码试图访问字段并发问题会出现,如何防止它?
【问题讨论】:
-
关键问题是对象创建后是否被修改。如果不是,那么通常 Spring 会在构造和使用之间提供发生之前的关系。如果对象在创建后被修改,则需要处理某种形式的同步(例如 volatile)。但我会三思而后行。
-
Object 由 Spring 创建并由调度程序稍后修改,除了 Volatile 之外还有其他选项吗?
-
Volatile 本身就是一个很好的解决方案。我不明白你为什么要阻止它。
标签: java spring kotlin concurrency spring-bean