在多线程环境中,是否可以使用具有本地并发Collection的静态方法?

问题描述 投票:0回答:1

考虑下面这个获取varargs参数的通用静态方法。

public static <T> Predicate<T> distinctBy(Function<? super T, ?>... fieldSelectors)
{
    final Map<List<?>, Boolean> seen = new ConcurrentHashMap<>();
    return t ->
    {
        final List<?> keys = Arrays.stream(fieldSelectors)
                .map(k -> k.apply(t))
                .collect(Collectors.toList());
        return seen.putIfAbsent(keys, Boolean.TRUE) == null;
    };
}

后期在实现中我让调度员的作业多线程,通过不同的线程来使用这个静态方法,如下图。

List<X> xlist = list1.stream()
                .filter(distinctBy(X::funcX1, X::funcX2, X::funcX3))
                .collect(Collectors.toList());

List<Y> ylist = list2.stream()
                 .filter(distinctBy(Y::funcY1, Y::funcY2))
                 .collect(Collectors.toList());

我也从代码分析中得到一个警告,说有可能因为varargs参数而造成堆污染。是不是因为静态方法里面使用了ConcurrentHashMap?

multithreading static-methods java.util.concurrent
1个回答
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.