问题描述
使用 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
,看看会发生什么。