SonarQube 错误:Singleton class 以不同步的方式写入字段

SonarQube bug: Singleton class writes to a field in an Unsynchronized manner

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

@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
   }

}

通常 class 用 spring 的 @Component 注释注释的是单例,除非指定了不同的范围(如请求)。这与 class 的 实例 将由 spring 在每个 class 自动装配的地方注入。通过为单例的内部字段提供 setter ,单独的线程可以以不同步的方式设置值,搞乱 class.

的内部逻辑

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

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

问题应该是

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

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

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