代码之家  ›  专栏  ›  技术社区  ›  Jin Kwon

我有什么过错吗java:S3077?

  •  0
  • Jin Kwon  · 技术社区  · 4 年前

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

    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
    1 回复  |  直到 4 年前
        1
  •  1
  •   tgdavies    4 年前

    “线程安全类型”是指可以由多个线程使用而没有问题的类型。

    所以如果 Other 是不可变的,对于S3077来说,它是一个“线程安全类型”。

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

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

    推荐文章