【问题标题】:Singleton writes a field in unsynchronized manner单例以非同步方式写入字段
【发布时间】:2020-12-04 00:30:14
【问题描述】:

我得到:Singleton 类在通过 SonarQube 扫描时在 Springboot 代码中的 4-5 个位置以不同步的方式写入字段。现在,我想了解如何让这个警告消失?是否有针对此错误的一般修复方法

一个例子如下:

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));
        
    }
}

【问题讨论】:

  • 答案很简单。根据声纳的说法,问题在于它是不同步的。你认为“不同步”的反义词是什么?
  • 如果您在 UI 中单击“查看规则”,通常会得到带有一些示例的说明。

标签: java multithreading spring-boot sonarqube


【解决方案1】:
  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;
    }
}

【讨论】:

    猜你喜欢
    • 2021-12-20
    • 2020-07-29
    • 1970-01-01
    • 1970-01-01
    • 2020-07-04
    • 2015-08-07
    • 2020-12-02
    • 2021-05-12
    • 1970-01-01
    相关资源
    最近更新 更多