我对这个 java:S3077 有什么问题吗?

问题描述

我有一个类,它的字段只能懒惰地初始化。

class Some {

    public Some getPrevIoUs() {
        {
            final Some result = prevIoUs;
            if (result != null) {
                return result;
            }
        }
        synchornized (this) {
            if (prevIoUs == null) {
                prevIoUs = computePrevIoUs();
            }
            return prevIoUs;
        }
    }

    // all fields are final initialized in constructor
    private final String name;

    // this is a lazy initialized self-type value.
    private volatile Some prevIoUs;
}

现在声纳云一直在抱怨 java:S3077

使用线程安全类型;添加“volatile”不足以使该字段成为线程安全的。

  • 代码有问题吗?
  • 我可以(应该)忽略它吗?
  • 使用 atomicreference 怎么样?这不是矫枉过正吗?

解决方法

“线程安全类型”意味着可以被多个线程使用而不会出现问题。

因此,如果 Other 是不可变的,那么就 S3077 而言,它是一种“线程安全类型”。

如果它是一个被设计为由多个线程使用的类,例如ConcurrentHashMap,那么它也是“线程安全类型”。

如果您使用 google S3077,您可以找到回答您问题的有用讨论,例如https://community.sonarsource.com/t/java-rule-s3077-should-not-apply-to-references-to-immutable-objects/15200