CMSgov/dpc-app

View on GitHub
dpc-api/src/main/java/gov/cms/dpc/api/core/Capabilities.java

Summary

Maintainability
A
0 mins
Test Coverage
B
87%

Fully initialize "statement" before assigning it.
Open

                    statement = buildCapabilities(baseURL);

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

There are no issues that match your filters.

Category
Status