IOUtils.ToByteArray(InputStream) 是线程安全的吗?

问题描述

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

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

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

  ...
}

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

解决方法

我的意思是这个方法中的 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,看看会发生什么。

enter image description here