首页 > 解决方案 > 这个 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;
}

现在 sonarcloud 一直在抱怨java:S3077

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

标签: javavolatilelazy-initializationdouble-checked-lockingsonarcloud

解决方案


“线程安全类型”是指可以由多个线程使用而不会出现问题的类型。

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

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

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


推荐阅读