如何解决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
,看看会发生什么。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。