Findbugs:NP_LOAD_OF_KNOWN_NULL_VALUE - Singleton类双重检查

时间:2016-10-02 23:24:10

标签: java findbugs

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

Findbugs报告了以下错误。

BufferBlock<T>

Load of known null value in ... NP_LOAD_OF_KNOWN_NULL_VALUE

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

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

谢谢,

1 个答案:

答案 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 {
    }
}