[英]AsynchronousSocketChannel Read/WritePendingException - possible to synchronize?
I am working on a TCP Server and I am curious whether it is possible to synchronize the methods read and write of AsynchronousSocketChannel.我正在使用 TCP 服务器,我很好奇是否可以同步 AsynchronousSocketChannel 的读取和写入方法。 I wrapped the channel into another class because I needed some additional functionality on my channel.我将频道包装到另一个 class 中,因为我的频道需要一些额外的功能。 My question is if this is really the right way to synchronize this:我的问题是这是否真的是同步这个的正确方法:
/**
* writes bytes from a <b>ByteBuffer</b> into an
* <b>AsynchronousSocketChannel</b>
*
* @param buffer the ByteBuffer to write from
* @param onFailure specifies the method that should be called on failure of the
* write operation
*/
public void write(ByteBuffer buffer, final C onFailure) {
CompletionHandler<Integer, ByteBuffer> handler = new CompletionHandler<Integer, ByteBuffer>() {
@Override
public void completed(Integer result, ByteBuffer buf) {
if (buf.hasRemaining())
channel.write(buf, buf, this);
}
@Override
public void failed(Throwable exc, ByteBuffer buf) {
attachment.call(onFailure, exc);
}
};
synchronized (writeLock) {
this.channel.write(buffer, buffer, handler);
}
}
In this case writeLock
is a static final
object that aquires a lock when any of the arbitary instances of my wrapper class starts a write operation.在这种情况下writeLock
是一个static final
object ,当我的包装器 class 的任意实例开始写入操作时,它会获取锁。 Does this really work or does it just run out of the synchronized block?这真的有效还是只是用完了同步块?
This is how I fixed it:这就是我修复它的方法:
/**
* writes bytes from a <b>ByteBuffer</b> into an
* <b>AsynchronousSocketChannel</b>
*
* @param buffer the ByteBuffer to write from
* @param onFailure specifies the method that should be called on failure of the
* write operation
*/
public void write(ByteBuffer buffer, final C onFailure) {
CompletionHandler<Integer, ByteBuffer> handler = new CompletionHandler<Integer, ByteBuffer>() {
@Override
public void completed(Integer result, ByteBuffer buf) {
if (buf.hasRemaining()) {
channel.write(buf, buf, this);
return;
}
synchronized (writeLock) {
if (!writeQueue.isEmpty()) {
while (writePending)
;
ByteBuffer writeBuf = writeQueue.pop();
channel.write(writeBuf, writeBuf, this);
writePending = true;
return;
}
}
writePending = false;
}
@Override
public void failed(Throwable exc, ByteBuffer buf) {
writePending = false;
attachment.call(onFailure, exc);
}
};
synchronized (writeLock) {
while (this.writePending)
;
this.writeQueue.push(buffer);
ByteBuffer writeBuffer = this.writeQueue.pop();
this.channel.write(writeBuffer, writeBuffer, handler);
this.writePending = true;
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.