gpt4 book ai didi

java - Findbugs:NP_LOAD_OF_KNOWN_NULL_VALUE - 单例类双重检查

转载 作者:行者123 更新时间:2023-12-03 18:36:24 32 4
gpt4 key购买 nike

我有一个 Singleton 类,在构造函数中进行了双重检查。

Findbugs 报告以下错误。

在 ... NP_LOAD_OF_KNOWN_NULL_VALUE 中加载已知空值

class SomeClass {
private Object lock = new Object();
private Map<String,Resource> resourceMap = new HashMap<>();

public Resource getResource(String resourceId) {
if (resourceMap.get(resourceId) == null) {
synchronized(lock) {
if (resourceMap.get(resourceId) == null)
Resource resource = new Resource();
resourceMap.put(resourceId,resource);
}
}
return resourceMap.get(resourceId);
}
}

我可以使用静态对象引用,但要求是为唯一请求 ID 创建单个对象。

比如说,请求 ID 1 将用于多个请求。因此,我们必须为此在运行时为所有请求 ID 创建一个对象。

谢谢,

最佳答案

您应该使用 ConcurrentMap 而不是双重检查锁定模式。关于 map 元素的可见性,您的方法不正确(有关可见性的更多详细信息,请参阅以下 question)。

class SomeClass {
private final ConcurrentMap<String, Resource> resourceMap = new ConcurrentHashMap<>();

public Resource getResource(String resourceId) {
return resourceMap.computeIfAbsent(resourceId, r -> new Resource());
}

private static class Resource {}
}

使用 LRU 替换策略编辑以限制为 10 个元素

您可以使用 Guava cache默认使用 LRU 策略 size-based eviction .

import com.google.common.cache.*;

class SomeClass {
private final LoadingCache<String, Resource> resourceMap =
CacheBuilder.newBuilder()
.maximumSize(10L)
.build(new CacheLoader<String, Resource>() {
@Override
public Resource load(String key) {
return new Resource();
}
});

public Resource getResource(String resourceId) {
return resourceMap.getUnchecked(resourceId);
}

private static class Resource {
}
}

关于java - Findbugs:NP_LOAD_OF_KNOWN_NULL_VALUE - 单例类双重检查,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39822749/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com