单例以非同步的方式写一个字段

Singleton writes a field in unsynchronized manner

我得到:Singleton class 以不同步的方式写入字段 在 Springboot 代码的 4-5 处扫描 SonarQube 时。现在,我试图了解如何让这个警告消失?是否有针对此错误的通用修复程序

一个例子如下:

public class NewProvProcess {
    
    @Autowired
    DataExecutor dataexecutor;
    
    String flag = "N";
    
    public void dbFetchNewProvRecords() {
        
    do {
        try {
            Thread.sleep(180000);
            flag = dataexecutor.fetchNDBRunStatus();
            LOGGER.info("The Flag value is {}, checking again after 3 minute ", flag);
        } catch (InterruptedException e) {
            Thread.currentThread().interrupt();
        }
            
        }while(("N").equals(flag));
        
    }
}

  1. 永远不要直接公开可变字段,尤其是在不同线程可能需要访问它的情况下 - 将其设为私有。
  2. 同步对该字段的所有访问。

在最简单的情况下,可能会这样:

public class NewProvProcess {
    
    @Autowired
    DataExecutor dataexecutor;
    
    private String flag = "N";
    
    public void dbFetchNewProvRecords() {
        
        do {
            try {
                Thread.sleep(180000);
                synchronized(this) {
                    flag = dataexecutor.fetchNDBRunStatus();
                    LOGGER.info("The Flag value is {}, checking again after 3 minute ", flag);
                }
            } catch (InterruptedException e) {
                Thread.currentThread().interrupt();
            }
            
        }while(("N").equals(flag));
        
    }

    synchronized String getFlag() {
        return this.flag;
    }
}