为什么"管道化" CharBuffer挂起?
时间:2020-03-06 14:40:07 来源:igfitidea点击:
为什么以下方法会挂起?
public void pipe(Reader in, Writer out) {
CharBuffer buf = CharBuffer.allocate(DEFAULT_BUFFER_SIZE);
while( in.read(buf) >= 0 ) {
out.append(buf.flip());
}
}
解决方案
回答我自己的问题:我们必须在reads之间调用buf.clear()。据推测,因为缓冲区已满,所以" read"正在挂起。正确的代码是
public void pipe(Reader in, Writer out) {
CharBuffer buf = CharBuffer.allocate(DEFAULT_BUFFER_SIZE);
while( in.read(buf) >= 0 ) {
out.append(buf.flip());
buf.clear();
}
}
我认为这是一个僵局。 in.read(buf)锁定CharBuffer并阻止out.append(buf)调用。
假设CharBuffer在实现中使用了某种锁。 API对类CharBuffer说什么?
编辑:对不起,我的大脑出现某种短路...我将其与其他东西混淆了。

