java - 这个 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”不足以使该字段成为线程安全的。
- 代码有什么问题吗?
- 我可以(应该)忽略它吗?
- 怎么用
AtomicReference
?这不是矫枉过正吗?
解决方案
“线程安全类型”是指可以由多个线程使用而不会出现问题的类型。
因此,如果Other
它是不可变的,则对于 S3077 而言,它是一种“线程安全类型”。
如果它是一个设计为由多个线程使用的类,例如 a ConcurrentHashMap
,那么它也是一个“线程安全类型”。
如果你用谷歌搜索 S3077,你可以找到有用的讨论来回答你的问题,例如https://community.sonarsource.com/t/java-rule-s3077-should-not-apply-to-references-to-immutable-objects/15200
推荐阅读
- wordpress - 如何覆盖 woocommerce_download_file_redirect 函数?
- excel - Sumifs或索引匹配?
- javascript - 如何创建具有给定键和值的对象?
- php - PhpOffice 将 excel 转换为 json
- java - 针对不同用户的设计模式
- api - 使用 GCP API 网关的 Graphql 后端的 OpenAPI 配置?
- google-apps-script - 有没有我可以创建的谷歌脚本,所以我的电子表格中的每一行都会复制到一个新的单独的工作表中?
- python - 给出响应后如何继续执行函数?
- visual-studio - 在调试会话之间单独保留选项卡 (Visual Studio 2019)
- javascript - Puppeteer:转到页码