问题描述
我创建了一个 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
)
这个过程发生在不同的线程上,所以在插入字段值时如果我的代码尝试访问字段并发问题就会出现,如何防止?
解决方法
这类似于多线程缓存读/写,对于这种问题,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("")
)