java - 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
)
这个过程发生在不同的线程上,所以在插入字段值时如果我的代码尝试访问字段并发问题会出现,如何防止它?
解决方案
这类似于多线程缓存读/写,因为这种问题 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("")
)
推荐阅读
- bash - 多个 .bashrc 配置文件
- php - Image Magick - 如何从图像创建 pdf 文档而不是让它看起来像图像 - PHP?
- php - wordpress 中的用户过滤器
- php - PHP突然插入空白值
- r - ggplot2:叠加两层时出错
- sql - 如果日期是周末或银行假日,则调整日期
- facebook-graph-api - Facebook Graph Api 为 Ad Insights API 返回空数据
- spring-boot - 如何使用 keycloak 在 Spring Security 中同时保护 Web 浏览器请求和 Restful 请求
- mysql - MySQL 计数已排序
- xamarin.forms - xamarin.forms:仅跟踪用户发起的更改