单例以非同步的方式写一个字段
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));
}
}
- 永远不要直接公开可变字段,尤其是在不同线程可能需要访问它的情况下 - 将其设为私有。
- 同步对该字段的所有访问。
在最简单的情况下,可能会这样:
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;
}
}
我得到: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));
}
}
- 永远不要直接公开可变字段,尤其是在不同线程可能需要访问它的情况下 - 将其设为私有。
- 同步对该字段的所有访问。
在最简单的情况下,可能会这样:
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;
}
}