问题描述
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