dpc-api/src/main/java/gov/cms/dpc/api/core/Capabilities.java
Fully initialize "statement" before assigning it. Open
Open
statement = buildCapabilities(baseURL);
- Read upRead up
- Exclude checks
Double-checked locking can be used for lazy initialization of volatile
fields, but only if field assignment is the last step in the
synchronized
block. Otherwise you run the risk of threads accessing a half-initialized object.
Noncompliant Code Example
public class MyClass { private volatile List<String> strings; public List<String> getStrings() { if (strings == null) { // check#1 synchronized(MyClass.class) { if (strings == null) { strings = new ArrayList<>(); // Noncompliant strings.add("Hello"); //When threadA gets here, threadB can skip the synchronized block because check#1 is false strings.add("World"); } } } return strings; } }
Compliant Solution
public class MyClass { private volatile List<String> strings; public List<String> getStrings() { if (strings == null) { // check#1 synchronized(MyClass.class) { if (strings == null) { List<String> tmpList = new ArrayList<>(); tmpList.add("Hello"); tmpList.add("World"); strings = tmpList; } } } return strings; } }
See
- CERT, LCK10-J. - Use a correct form of the double-checked locking idiom
See Also
- {rule:java:S2168} - Double-checked locking should not be used