为什么"管道化" 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说什么?

编辑:对不起,我的大脑出现某种短路...我将其与其他东西混淆了。