在多个线程之间共享流实例是否安全?

时间:2016-04-06 16:26:18

标签: java multithreading java-8 java-stream

我有一套钥匙。

class X {
  private static String[] keys = {"k1", "k2", ... };

我必须从请求中提取键的值。我想我可以使用map来提取值并在某些请求处理方法中创建列表必需的对象,如下所示:

  public void processReq(Request req) {
    ...
    Stream.of(keys).map(k-> new Pack(k, req.getHeader(k)));

但是,每个请求创建Stream看起来都是不必要的任务。如果在多个线程之间共享Stream实例是安全的,我想我可以像这样修改代码:

class X {
  private static Stream<String> keys = Stream.of("k1", "k2", ...);
  ...

  public void processReq(Request req) {
    ...
    keys..map(k-> new Pack(k, req.getHeader(k)));

那么,在多个线程之间共享Stream实例是否安全?

2 个答案:

答案 0 :(得分:6)

Streams不打算多次使用,即使在同一个线程中也是如此。如果您想拥有一个集合,请使用List(或数组)

 private static final List<String> keys = Arrays.asList("k1", "k2", ...);

这可以多次使用。

List<Pack> packs = keys.stream()
                       .map(k-> new Pack(k, req.getHeader(k)))
                       .collect(Collectors.toList());

在您的代码中,new Packreq.getHeader是花费大部分时间的地方。

答案 1 :(得分:0)