1
在Java中使用NIO套接字时,一旦连接,我既可以注册读写操作,也可以在收到写入通知时不做任何事情,出站缓冲区中没有任何内容,或者我只能注册读取通知,并且只有在出站缓冲区中放置了某些内容时才重新注册读取和写入。我倾向于后者,但我关心两件事。使用NIO套接字时读取和写入的注册策略
- 经常重新注册感兴趣的操作是否会导致任何显着的性能损失?
- 将感兴趣的操作重新注册到另一个线程中,而不是执行IO操作的线程会造成任何问题?
编辑:
其实另一个发生在我。为了正常工作,我需要打开将出站数据添加到套接字的线程中的写入注册,并且在通信线程中,当出站队列为空时,我需要关闭写入注册。然而,这也开启了以下情形
IO Thread Other Thread
Check if buffer empty
Add Item to buffer
Register for write notification
Turn off write notifications
我看到避免这种情况是开启线程同步的缓存本身,以便修改(或检查)的缓冲和注册的改变基于这一点的唯一途径成为一个原子操作。
如果我需要保留字节输出的顺序,我看不出如何工作。在我甚至可以尝试发送我试图添加到缓冲区的数据之前,我必须清空出站缓冲区。我会牢记这一点,并会在确定发送代码的复杂性之后,看看这是多么可行。 – Jherico 2010-02-19 01:58:29
是的,你必须按顺序写。但是,由于你已经锁定了缓冲区,你可以尝试在缓冲区中写入第一个数据,而不是将数据添加到缓冲区的末尾(除非它是唯一的数据)。 – Darron 2010-02-19 16:29:59