I am getting : Singleton class writes to a field in an unsynchronized manner at 4-5 places in Springboot code while scanning through SonarQube. Now, I am trying to understand how can I make this warning go away? Is there a general fix for this error
One example is below :
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));
}
}
Advertisement
Answer
- never ever expose a mutable field directly, least of all if there is any chance a different thread might need to access it – make it private.
- synchronize all access to the field.
In the simplest case, something like this might do:
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;
}
}
