微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Spring bean 字段线程安全

如何解决Spring bean 字段线程安全

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

enter image description here

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

一些代码

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

    @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("")
)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。