Java: São possíveis leituras e gravações simultâneas em um SocketChannel de bloqueio por meio de putStreams (In | Out)?

Eu criei umObjectInputSteam eObjectOutputStream em um bloqueioSocketChannel e estou tentando ler e escrever simultaneamente. Meu código é algo assim:

socketChannel = SocketChannel.open(destNode);
objectOutputStream = new ObjectOutputStream(Channels.newOutputStream(socketChannel));
objectInputStream = new ObjectInputStream(Channels.newInputStream(socketChannel));

Thread replyThread = new Thread("SendRunnable-ReplyThread") {
    @Override
    public void run() {
        try {
            byte reply = objectInputStream.readByte();//(A)
            //..process reply
        } catch (Throwable e) {
            logger.warn("Problem reading receive reply.", e);
        }
    }
};
replyThread.start();

objectOutputStream.writeObject(someObject);//(B)
//..more writing

Problema é a gravação em blocos de linha (B) até que a leitura na linha (A) seja concluída (blocos no objeto retornado porSelectableChannel#blockingLock() ). Mas a lógica do aplicativo determina que a leitura não será concluída até que todas as gravações sejam concluídas, portanto, temos um bloqueio efetivo.

SocketChannel Os javadocs dizem que as leituras e gravações simultâneas são suportadas.

Não tive esse problema quando tentei uma solução de soquete comum:

Socket socket = new Socket();
socket.connect(destNode);
final OutputStream outputStream = socket.getOutputStream();
objectOutputStream = new ObjectOutputStream(outputStream);
objectInputStream = new ObjectInputStream(socket.getInputStream());

No entanto, não posso aproveitar os benefícios de desempenho deFileChannel#transferTo(...)

questionAnswers(4)

yourAnswerToTheQuestion