原创 【原理】:JAVA線程池源碼分析

總結:線程池ThreadPoolExecutor是通過控制Worker對象的數量來維護工作的工人集合,並且通過任務隊列workerQueue來存儲提交到線程池的任務。通過配置相關的容量,以及拒絕策略來更方便使用以及處理容量飽滿的情況。Wor

原创 【原理】:JDK動態代理源碼分析

【總結】:JDK動態代理的原理是通過目標對象提供的classloader、interfaces的Class對象數組、InvocatiionHandler提供的代理邏輯來重新定義並在內存生成一個代理類的class文件並且通過構造器對象實例化並

原创 【面試】不使用synchronized和lock,如何實現一個線程安全的單例

import java.util.concurrent.atomic.AtomicReference; public class HungrySingleton { private static HungrySingleton

原创 netty源碼分析(29)- directArena分配direct內存的流程

上一節眼研究了PooledByteBufAllocator分配內存的前兩個步驟,通過ThreadLocal的方式拿到PoolThreadCache之後,獲取對應的Arena。那麼之後就是Arena具體分配內存的步驟,正是本節研究學習的內容。

原创 netty源碼分析(28)- PooledByteBufAllocator分析

上一節分析了UnpooledByteBufAllocator,包括了堆內堆外內存是如何分配的,底層時時如何獲取數據內容的。 本節分析分析PooledByteBufAllocator,看看它是怎麼做Pooled類型的內存管理的。 入口Poo

原创 netty源碼分析(27)- UnpooledByteBufAllocator分析

上一節查看了ByteBufAllocator,並瞭解了其抽象實現,和一些根據不同的內存類型進行內存分配的思路。 本節研究UnpooledByteBufAllocator,包括heap和direct的內存分配,以及Unsafe和非unsafe

原创 netty源碼分析(26)- ByteBufAllocator分析

上一節簡單理解了以下ByteBuf的結構。詳細的api還需要自己奪取嘗試。 本節學些ByteBufAllocator,內存分配器(管理器) 查看ByteBufAllocator,作爲頂層接口,它根據內存分配的類型定製了一些分配方法,主要

原创 netty源碼分析(25)- ByteBuf

本節開始學習netty的內存分配機制,搜先是ByteBuf。 作爲一個容器,源碼中的如下。有三塊區域 discardable bytes:無效空間(已經讀取過的空間),可丟棄字節的區域,由readerIndex指針控制 readable

原创 netty源碼分析(24)- pipeline總結

從18到23節都是在學習pipeline裏面的內容,包括了ChannelHandler,ChannelHandlerContext,事件的傳播。本節進行總結一下。 pipeline初始化:在服務端channel和客戶端channel創建

原创 netty源碼分析(23)- 異常的傳播

上一節研究了outbound事件的傳播過程,是和ChannelOutboundHandler的添加順序相反的。從pipeline或者channel調用outbound事件的傳播方法,是從TailContext開始傳播,直到HeadConte

原创 netty源碼分析(22)- outBound事件的傳播

上一節學習了inbound事件的傳播,充分理解了在pipeline中是如何向一個個handler傳播事件的,以channelRead事件也就是讀事件爲例,研究了其處理邏輯。 本節學習outbound事件的傳播,和inbound事件有相似之處

原创 netty源碼分析(21)- inBound事件的傳播

上一節學習了刪除ChannelHandler的過程,至此我們已經瞭解了pipeline和ChannelHandlerContext,ChannelHandler着三者之間的關係。pipeline通過維持一個鏈表結構,鏈表節點是Channel

原创 netty源碼分析(20)- 刪除ChannelHandler過程

上一節學習了添加ChannelHandler的過程瞭解了,也明白了添加handler是如何促發handlerAdded事件。其中還包括了ChannelInitializer這樣特殊的handler,在完成了添加handler的任務後,就從p

原创 netty源碼分析(18)- pipeline初始化

本節開始學習pipeline相關的源碼,回顧在前面學些的章節中,無論是服務端channel還是客戶端channel在初始化的時候,都會創建其pipeline。因此初始化pipeline的入口在創建channed的過程中。 prote

原创 netty源碼分析(19)- 添加ChannelHandler過程

上一節學習了pipeline初始化的過程。初始化了HeadContext和TailContext,並構建了pipeline雙向鏈表,每個節點存儲ChannelHandlerContext。 本節研究添加ChannelHandler的過程。在