簡體   English   中英

IOUtils.ToByteArray(InputStream) 是線程安全的嗎?

[英]IOUtils.ToByteArray(InputStream) is thread safe?

使用IOUtils.ToByteArray會導致並發問題嗎?

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

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

  ...
}

我的意思是這個方法中的letterContent是否可能由於並發而錯誤地更改?

我的意思是這個方法中的 letterContent 是否可能由於並發而錯誤地更改?

當然,在不保護輸入的InputStream的情況下調用toByteArray(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看看會發生什么。

在此處輸入圖像描述

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM