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