使用IOUtils.ToByteArray
会导致并发问题吗?
private byte[] saveLetterContent(InputStream input) {
...
byte[] letterContent = IOUtils.toByteArray(input);
...
}
我的意思是letterContent
这种方法是否可能由于并发而错误地更改?
使用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
看看会发生什么。