0

使用IOUtils.ToByteArray会导致并发问题吗?

private byte[] saveLetterContent(InputStream input) {
  ...

  byte[] letterContent = IOUtils.toByteArray(input);

  ...
}

我的意思是letterContent这种方法是否可能由于并发而错误地更改?

4

1 回答 1

3

我的意思是这个方法中的 letterContent 是否可能由于并发而错误地更改?

toByteArray(InputStream)绝对地,在不保护输入的情况下调用InputStream会导致未定义的行为。这也很容易证明。

final String value = "hello! ciao!";
final byte[] valueBytes = value.getBytes(StandardCharsets.UTF_8);
System.out.println(valueBytes.length);

final ByteArrayInputStream is = new ByteArrayInputStream(valueBytes);

new Thread(() -> {
   try {
      is.read(new byte[10]);
   } catch (final IOException e) {
      //
   }
}).start();

// Thread.sleep(50)

final byte[] bytes = IOUtils.toByteArray(is);
System.out.println(bytes.length);

对于上面的示例,您肯定会注意到第二个System.out将打印比第一个更小的字节长度。你甚至可以玩,Thread.sleep看看会发生什么。

在此处输入图像描述

于 2021-02-06T10:15:20.233 回答