`
文章列表
remote 層關注 transport 和 exchange 這兩個包即可. 因為這兩個包下封裝了通訊相關的內容. 先來補充點額外知識: 1.Endpoint 是端點的概念,我們可以看到,對其抽象,最主要的是一個 send 方法,用于發送數據. 但是我有一個疑問?為啥 Endpoint 不抽象出 receive ? 2.Endpoint 的 send 方法和 ChannelHandler 的 sent 方法的區別和聯系? 剛剛我看了下 netty4 下面的 NettyServerHandler 和 NettyChannel,發現 ChannelHandler 中定義的 sent 方法、rece ...
dubbo 是支持多種序列化方式的,那么它就必須在此基礎上做一層封裝,來統一序列化層的接口. 現在我們拿 Java 中的序列化來講解 dubbo 是如何進行封裝的. 如果使用 java 序列化,需要做那幾步了? 1.實現 java.io.Serializable 2.new ObjectOutputStream,并調用 writeObject 方法寫對象 反序列化: 1.new ObjectInputStream 2.調用 readObject 方法讀對象. 那么現在 dubbo 需要在此基礎上,可以自由使用多種序列化方式,該如何做了? 1.是不是需要一個類似 ObjectOutputStrea ...
說明:本篇文章是在閱讀《Java 并發編程藝術》過程中的一些筆記和分析,由于本人能力有限,如果有書寫錯誤的地方,歡迎各位大佬批評指正!我們互相交流,學習,共同進步! 該項目的地址:https://github.com/xiaoheng1/concurrent-programming 1.Java 中的鎖,值的是 Lock, 它和 synchronized 實現的功能類似,但是其更加的強大,比如說超時獲取鎖等. 世上沒有兩全的東西,越是功能強大 的東西,那么它的復雜性肯定會增加. Lock 和 synchronized 相比,synchronized 隱式的獲取,釋放鎖,使用起來更加的方法,但是 ...
說明:本篇文章是在閱讀《Java 并發編程藝術》過程中的一些筆記和分析,由于本人能力有限,如果有書寫錯誤的地方,歡迎各位大佬批評指正!我們互相交流,學習,共同進步! 該項目的地址:https://github.com/xiaoheng1/concurrent-pro ...
1.首先要說下 Java 內存模型的抽象,JMM 規定了每個線程都有自己的本地內存,本地內存中存放的是主內存中 共享變量的拷貝. 現在線程 A 需要和線程 B 通訊,則需要通過 A 的本地內存,在 JMM 的控制下,到主內存, 然后從主內存? ...
有關 Java 并發編程藝術的閱讀筆記可以去我的 github 上查看: 地址:https://github.com/xiaoheng1/concurrent-programming 本人能力有限,歡迎各位大佬批評指正,我們互相交流,互相學習,共同進步!
dubbo 中有四個線程池: CachedThreadPool:每隔 1 分鐘回收空閑線程 FixedThreadPool:固定數量線程 LimitedThreadPool:動態擴展,但是不會收縮 EagerThreadPool:調整了JDK 線程池的工作流程 總結:這四類線程池都是基于 JDK 中的線程池. 需要注意的是 EagerThreadPool. 它修改了 JDK 中線程池的工作流程. 1.<coreSize或 >maxThreadSize,則加入到隊列中 2.>coreSize 且 <maxThreadSize,則創建線程處理.
關于 dubbo 的 SpiExtensionFactory 的一點說明: 本篇文章不想比較 dubbo 的 spi 和 jdk spi 的異同,網上有太多文章寫了這塊,本篇文章主要想說 dubbo @Adaptive 注解的設計以及 SpiExtensionFactory 類. 我們先看下 SpiExtensionFactory 類: public <T> ...
1.首先 bossLoop Accept 客戶端的連接. 2.bossLoop 創建 NioSocketChannel,并完成對讀事件的注冊. 3.當客戶端發送消息的時候,被 NioSocketChannel 處理.
TCP為啥是可靠的? 首先 TCP 是面向連接的,就跟打電話一樣。 TCP報文格式:源端口、目的端口、校驗和、序號、確認號、窗口+數據部分 TCP 是如何保證連接的了? 1.序列號 TCP在傳輸的過程中,對每一個字節都進行了編號,這就是序列號. 序列號的作用: 1.確保數據按序到達 2.保證可靠性(比如說缺哪個序號的數據就能知道) 3.提高效率,可以多次發送,一次確認 4.去除重復數據 2.校驗和 校驗和用于檢驗端到端傳輸的過程中,TCP頭部和數據部分是否發生了變化.在計算校驗和的時候添加16位的偽首部用于增強校驗。將數據分成16位的多個段,每個段取反相加。 3.擁塞控制 擁塞控制采用慢啟動的策 ...
啥都是虛的,早上這個可能是好的,晚上可能就壞了。平淡處之。
發展: BIO -> NIO -> AIO BIO就是我們傳統意義上的IO,它的特點是阻塞的。例如以前我們進行網絡編程時,一個客戶端使用一個線程來進行處理。這樣會導致一個問題:服務器的線程數是有限制的,而不是每個客戶端時時都有數據進行傳輸的。所以大量空的線程占了位置,但是又不工作,導致服務器的性能受限。 這會涉及到4次上下文切換和4次拷貝。 第一次切換:從用戶態切換到內核態,將數據讀取到內核 第二次切換:從內核態切換到用戶態,讀取返回 第三次切換:從用戶態切換到內核態,將數據拷貝到內核 第四次切換:從內核態切換到用戶態,寫完返回 四次拷貝: 1.通過DMA將數據從硬件拷貝到內核 2. ...
簡單動態字符串: struct{ ?? int len ?? int free ?? char buf[]; } 簡單動態字符串比 C 中字符串的優點: 1.可以很快的獲取字符串的長度 2.在進行字符串操作時,防止溢出 3.減少修改字符串時帶來的頻繁內存分配 鏈表: struct listNode{ ??? listNode * prev; ??? listNode * next; ??? void * value; } typedef struct list{ ??? // 表頭節點 ??? listNode * head; ??? // 表尾節點 ??? listNode * tail; ? ...
說明:Byte 類的實現,有一部分方法是借助于 Integer 類的實現. /* * Copyright (c) 1996, 2009, Oracle and/or its affiliates. All rights reserved. * ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. * * * * * * * * * * * * * * * * * * * * */ package jdk.java.lang; /** * * The {@code Byt ...
在 Java 中字符串的執行速度是 StringBuilder > StringBuffer > String 了? 我們先說下 StringBuilder 和 StringBuffer 這兩個類. 首先這兩個類都是繼承的 AbstractStringBuilder. 我們可以看到 AbstractStringBuilder 中使用 char[] 數組來存儲字符. 換句話說,AbstractStringBuilder 相當于一個 ArrayList,不過的是 AbstractStringBuilder 只存儲字符. 這和 String 的區別是,當一個字符串被頻繁的修改的時候,Abs ...
Global site tag (gtag.js) - Google Analytics