我有什么错吗java:s3077?

aydmsdu9  于 2021-06-29  发布在  Java
关注(0)|答案(1)|浏览(589)

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

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 ? 是不是杀伤力太大了?

ybzsozfc

ybzsozfc1#

“线程安全类型”是指可以由多个线程使用而没有问题的类型。
所以如果 Other 是不可变的,在s3077中是“线程安全类型”。
如果它是一个设计用于多个线程的类,例如 ConcurrentHashMap ,则它也是“线程安全类型”。
如果你在googles3077上搜索,你可以找到有用的讨论来回答你的问题。https://community.sonarsource.com/t/java-rule-s3077-should-not-apply-to-references-to-immutable-objects/15200

相关问题