java - SonarQube 错误 : Singleton class writes to a field in an Unsynchronized manner

标签 java spring spring-boot sonarqube

在 SonarQube 扫描中,它在下面提到的行中显示了一个主要错误。该问题指出,Singleton 类以不同步的方式写入字段。我不明白,为什么这是一个问题?

@Configuration
@ConfigurationProperties(prefix = "app")
public class UrlConfigs() {

   @Autowired
   private List<UrlItems> item;

   //Getter & Setter

}

@Component
public class UrlItems {

   private String url;
   private String location;

   // Getter

   public void setUrl(String url){
      this.url = url; // ISSUE: Singleton class writes to a field in an unsynchronized manner
   }

   public void setLocation(String location) {
       this.location = location; // ISSUE: Singleton class writes to a field in an unsynchronized manner
   }

}

最佳答案

通常,用 spring 的 @Component 注释注释的类是单例,除非指定了不同的范围(如请求)。这就是 spring 在该类 Autowiring 的每个位置注入(inject)该类的同一个实例。通过为单例的内部字段提供 setter ,单独的线程可以以不同步的方式设置值,从而扰乱类的内部逻辑。

通常 SonarQube 应提供有关如何解决此类警告的附加信息和提示。

解决该警告的最简单方法是将 synchronized 关键字添加到 setter 方法中。为了使您的代码至少可能正确,需要将此同步添加到相应成员的所有读取和写入用法中。这很可能会导致其他问题 - 不谈论性能......

问题应该是

Why do you need state in an @Component class and are there ways to avoid this state?

要回答这个问题,需要知道这个类及其成员的实际使用方式。

如果您仅在 @ConfigurationProperties 类的上下文中使用 UrlItems,则不需要自动连接它,也不需要 @Component 类,而是需要一个简单的 Java bean。 Spring 将根据需要创建此类的实例。

关于java - SonarQube 错误 : Singleton class writes to a field in an Unsynchronized manner,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69876849/

相关文章:

java - Java 中的冒泡排序 ArrayIndexOutOfBounds

java - 使 GridView 下方的 ImageView 与 GridView 的大小完全匹配的简单方法?

java - 如何创建由 Map 支持的可变列表

java - 如何将列表从 Controller 发送到thymeleaf

grails - 如何使用grails-datastore-gorm在 Spring 启动中获取所有域类?

java - java中这两种写入文件的方式有什么区别?

xml - 无法在 Alfresco 中禁用创建站点权限

java - 如何让 Spring Boot 应用程序在数据源是否可用的情况下运行

java - Pivot Cloud Foundry 错误 : "Browser detection failed and system property h2.browser not set" - Spring Boot 2

java - @RestController ("/xxx") 映射被忽略