这个java:S3077有我的错吗?
Do I have any fault for this java:S3077?
我有一个class,它的字段不得不延迟初始化。
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
。
Use a thread-safe type; adding "volatile" is not enough to make this field thread-safe.
- 代码有问题吗?
- 我可以(应该)忽略它吗?
- 使用
AtomicReference
怎么样?是不是太过分了?
A 'thread safe type' 表示可以被多个线程使用而不会出现问题。
因此,如果 Other
是不可变的,那么就 S3077 而言,它是一个 'thread-safe type'。
如果它是一个 class 设计用于多个线程,例如一个ConcurrentHashMap
,那么也是一个'thread-safe type'.
如果你 google S3077 你可以找到有用的讨论来回答你的问题,例如https://community.sonarsource.com/t/java-rule-s3077-should-not-apply-to-references-to-immutable-objects/15200
我有一个class,它的字段不得不延迟初始化。
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
。
Use a thread-safe type; adding "volatile" is not enough to make this field thread-safe.
- 代码有问题吗?
- 我可以(应该)忽略它吗?
- 使用
AtomicReference
怎么样?是不是太过分了?
A 'thread safe type' 表示可以被多个线程使用而不会出现问题。
因此,如果 Other
是不可变的,那么就 S3077 而言,它是一个 'thread-safe type'。
如果它是一个 class 设计用于多个线程,例如一个ConcurrentHashMap
,那么也是一个'thread-safe type'.
如果你 google S3077 你可以找到有用的讨论来回答你的问题,例如https://community.sonarsource.com/t/java-rule-s3077-should-not-apply-to-references-to-immutable-objects/15200