singleton以非同步方式写入字段

ghhkc1vu  于 2021-07-06  发布在  Java
关注(0)|答案(1)|浏览(360)

我得到:singleton类在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));

    }
}

prdp8dxp

prdp8dxp1#

永远不要直接公开一个可变的字段,尤其是如果有可能其他线程可能需要访问它-使它私有。
同步对字段的所有访问。
在最简单的情况下,这样做可能会:

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

相关问题