2010-02-19 44 views
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 

我看到避免這種情況是開啓線程同步的緩存本身,以便修改(或檢查)的緩衝和註冊的改變基於這一點的唯一途徑成爲一個原子操作。

回答

0

你已經基本明白了。您希望打開和關閉寫入興趣,並且需要同步(或單線程)。另一點:只要你在你的「其他線程」鎖定,你應該嘗試寫作,然後再打開興趣。非阻塞寫入通常會成功,您將獲得效率。他們會讓你更多地認識你。

+0

如果我需要保留字節輸出的順序,我看不出如何工作。在我甚至可以嘗試發送我試圖添加到緩衝區的數據之前,我必須清空出站緩衝區。我會牢記這一點,並會在確定發送代碼的複雜性之後,看看這是多麼可行。 – Jherico 2010-02-19 01:58:29

+0

是的,你必須按順序寫。但是,由於你已經鎖定了緩衝區,你可以嘗試在緩衝區中寫入第一個數據,而不是將數據添加到緩衝區的末尾(除非它是唯一的數據)。 – Darron 2010-02-19 16:29:59