我有一个Singleton类,在构造函数中有双重检查。
Findbugs报告了以下错误。
BufferBlock<T>
Load of known null value in ... NP_LOAD_OF_KNOWN_NULL_VALUE
我可以使用静态对象引用,但要求是为唯一的请求ID创建单个对象。
说,请求ID 1将存在多个请求。因此,我们必须在运行时为所有请求ID创建一个对象。
谢谢,
答案 0 :(得分:0)
您应该使用ConcurrentMap而不是双重检查锁定模式。关于地图元素的可见性,您的方法不正确(有关可见性的更多详细信息,请参阅以下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个元素
您可以将使用LRU策略的Guava cache用于默认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 {
}
}