使用NIO套接字时的读写注册策略

时间:2010-02-19 00:33:42

标签: java sockets css-selectors nio

当使用Java中的NIO套接字时,一旦我连接,我可以注册读取和写入操作,只要我收到写入通知就什么也不做,我在出站缓冲区中什么也没有,或者我可以注册仅读取通知并仅在出站缓冲区中放置某些内容时重新注册以进行读取和写入。我倾向于后者,但我关心两件事。

  • 频繁重新注册感兴趣的操作是否会对性能造成重大影响?
  • 在执行IO操作的其他线程中重新注册感兴趣的操作是否会造成任何问题?

编辑:

实际上另一个发生在我身上。为了正常工作,我需要在将出站数据添加到套接字的线程中打开写入注册,并且在通信线程中,我需要在出站队列为空时关闭写入注册。但是,这会打开以下场景

      IO Thread                                    Other Thread
  Check if buffer empty
                                               Add Item to buffer
                                           Register for write notification 
Turn off write notifications 

我认为避免这种情况的唯一方法是打开缓冲区本身的线程同步,以便修改(或检查)缓冲区并根据它修改注册成为原子操作。

1 个答案:

答案 0 :(得分:0)

你基本上已经明白了。您希望打开和关闭写入兴趣,并且需要同步(或单线程)。

另一点:只要您在“其他线程”中锁定,就应该在开启兴趣之前尝试写作。通常,非阻塞写入将成功,您将获得效率。他们会为你赢得更多你想象的东西。