91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Netty對底層Selector如何優化

發布時間:2021-12-28 15:32:59 來源:億速云 閱讀:186 作者:小新 欄目:大數據

這篇文章主要為大家展示了“Netty對底層Selector如何優化”,內容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領大家一起研究并學習一下“Netty對底層Selector如何優化”這篇文章吧。

在創建NioEventLoop時會封裝一個JDK底層的Selector屬性

private Selector selector;

那么我們簡單看一下這個Selector在JDK層面的實現

public abstract class SelectorImpl extends AbstractSelector {    protected Set<SelectionKey> selectedKeys = new HashSet();    protected HashSet<SelectionKey> keys = new HashSet();    private Set<SelectionKey> publicKeys;    private Set<SelectionKey> publicSelectedKeys;

   protected SelectorImpl(SelectorProvider var1) {        super(var1);        if (Util.atBugLevel("1.4")) {            this.publicKeys = this.keys;            this.publicSelectedKeys = this.selectedKeys;        } else {            this.publicKeys = Collections.unmodifiableSet(this.keys);            this.publicSelectedKeys = Util.ungrowableSet(this.selectedKeys);        }    }}

從源碼中我們可以發現, 當服務器監聽到事件后會封裝成SelectionKey放到HashSet中, 然后程序就可以從這個HashSet中取出事件進行處理.

而HashSet的add方法的時間復雜度是O(n), 為此Netty通過反射機制, 將底層的這個HashSet用數組替換了, 畢竟向數組中添加數據的時間復雜度是O(1), 那么我們從代碼中找到答案吧.

NioEventLoop(NioEventLoopGroup parent, Executor executor, SelectorProvider selectorProvider,                 SelectStrategy strategy, RejectedExecutionHandler rejectedExecutionHandler) {            selector = openSelector();}

跟進openSelector()方法

private SelectorTuple openSelector() {  final SelectedSelectionKeySet selectedKeySet = new SelectedSelectionKeySet();}

它創建了一個SelectedSelectionKeySet對象, 我們再看下這個類

final class SelectedSelectionKeySet extends AbstractSet<SelectionKey> {

   SelectionKey[] keys;    int size;

   SelectedSelectionKeySet() {        keys = new SelectionKey[1024];    }

   @Override    public boolean add(SelectionKey o) {        if (o == null) {            return false;        }

       keys[size++] = o;        if (size == keys.length) {            increaseCapacity();        }

       return true;    }}

從這里我們可以發現, 這個Set集合底層使用的是數組, 調用add方法時直接向數組中添加元素就可以, 時間復雜度O(1).

接下來看下Netty使用反射替換掉那個HashSet

Field selectedKeysField = selectorImplClass.getDeclaredField("selectedKeys");Field publicSelectedKeysField = selectorImplClass.getDeclaredField("publicSelectedKeys");          
selectedKeysField.set(unwrappedSelector, selectedKeySet);publicSelectedKeysField.set(unwrappedSelector, selectedKeySet);

Netty就是通過反射用這個SelectedSelectionKeySet類替換掉了Selector類中的HashSet. 

這個地方之所以被Netty搞成這樣, 其實還是為了性能. 因為這個地方是涉及數據讀寫的源頭, 如果這個地方的性能不高, 會嚴重影響到程序的性能. 這也歸根結底回到了數據結構的知識.

以上是“Netty對底層Selector如何優化”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

蓬安县| 永清县| 怀集县| 石嘴山市| 新昌县| 南汇区| 策勒县| 志丹县| 光山县| 共和县| 神农架林区| 柯坪县| 偃师市| 陇西县| 桐庐县| 丹凤县| 吴桥县| 松溪县| 南澳县| 施甸县| 高阳县| 罗山县| 井冈山市| 耿马| 乐都县| 金秀| 高陵县| 吉木萨尔县| 军事| 云龙县| 泸州市| 团风县| 建昌县| 尼玛县| 宿州市| 肃北| 壤塘县| 咸宁市| 财经| 靖西县| 新竹市|