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

nta*_*lbs 1 java multithreading java-8 java-stream

我有一套钥匙.

class X {
  private static String[] keys = {"k1", "k2", ... };
Run Code Online (Sandbox Code Playgroud)

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

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

但是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)));
Run Code Online (Sandbox Code Playgroud)

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

Pet*_*rey 6

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

 private static final List<String> keys = Arrays.asList("k1", "k2", ...);
Run Code Online (Sandbox Code Playgroud)

这可以多次使用.

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

在您的代码中,new Pack或者req.getHeader是大部分时间花在的地方.