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