原创 ThreadLocal使用場景與原理

目錄 ThreadLocal的使用場景 ThreadLocal與synchronized的區別 Thread、ThreadLocal及ThreadLocalMap的關係 調用remove()方法避免內存泄漏 ThreadLocal的使用場

原创 Java Socket 工作機制

Socket 連接機制 主機 A 的應用程序要能和主機 B 的應用程序通信,必須通過 Socket 建立連接,而建立 Socket 連接必須由底層 TCP/IP 來建立TCP連接。TCP 是因特網中的傳輸層協議,使用三次握手協議建立連接。

原创 LeetCode兩數之和、三數之和(Java)

LeetCode第1題:兩數之和 給定一個整數數組 nums 和一個目標值 target,請你在該數組中找出和爲目標值的那 兩個 整數,並返回他們的數組下標。你可以假設每種輸入只會對應一個答案。但是,你不能重複利用這個數組中同樣的元素。

原创 緩存的三種讀寫方式

結合業務場景,緩存的讀寫方式可以分爲以下三種模式:  Cache Aside(旁路緩存) Read/Write Through(讀寫穿透) Write Behind Caching(異步緩存寫入) Cache Aside 查詢

原创 瞭解 Java IO 中的概念

目錄   Java的 IO 類庫的基本架構 什麼是 IO 流? 字節流與字符流 輸入流與輸出流 節點流 處理流 Java的 IO 類庫的基本架構 1、基於字節操作的I/O接口:InputStream和OutputStream; 2、基於字

原创 兩張圖對比 BIO 與 NIO

這裏通過現實中客人在飯店點餐的場景來模擬 IO過程。 BIO 這裏客人代表 socket 客戶端,餐廳代表服務端,服務員代表服務端線程池中的線程,服務員接待客人的過程等價於線程處理 IO 請求的過程。 這樣每新來一位客人,都會有一名服務員

原创 理解 IO 的同步、異步、阻塞、非阻塞

形象的說明 如果你想喫一份宮保雞丁蓋飯: 同步阻塞:你到飯館點餐,然後在那等着,還要一邊喊:好了沒啊! 同步非阻塞:在飯館點完餐,就去遛狗了。不過溜一會兒,就回飯館喊一聲:好了沒啊! 異步阻塞:遛狗的時候,接到飯館電話,說飯做好了,讓您親

原创 微信朋友圈設計原理

轉自:http://www.woshipm.com/pd/2701264.html 當你一秒鐘拍了張自拍,一個小時修了下圖,然後打開朋友圈,點擊發送的那一刻,後臺到底有多少工作在進行着? 我們太習以爲常,沒有意識到這背後還會有多複雜的邏輯

原创 Tomcat核心組件概述

Tomcat官網 https://tomcat.apache.org 什麼是Tomcat? The Apache Tomcat® software is an open source implementation of the Java

原创 Netty之內存管理

目錄 Netty內存規格介紹 內存區間劃分 內存分配單位 內存分配 命中緩存分配 申請新內存分配 ByteBuf的釋放與回收 Netty內存規格介紹 內存區間劃分 tiny:0~512B small:512B~8K normal:8K~

原创 破壞雙親委派模型

我們知道雙親委派模型很好的解決了各個類加載器基礎類型的一致性問題,而基礎類型往往是被用戶代碼繼承、調用的API存在,但這總設計有時候並不是完美的,比如基礎類型又要調用用戶的代碼,那該怎麼辦? 典型的例子就是SPI機制的實現,以JDBC的實

原创 秒殺系統設計原則

秒殺活動的特點 1、持續時間短,但訪問衝擊量大; 2、業務的請求量遠遠大於售賣量,大部分是最終無法購買成功的請求; 3、秒殺往往價格便宜,因此各種非法作弊手段層出。 設計原則 1、盡力將請求攔截在系統上游,如驗證碼等; 2、商品信息設計成

原创 緩存七大經典問題

目錄 一、緩存失效 二、緩存穿透 三、緩存雪崩 四、數據不一致 五、數據併發競爭 六、Hot key 七、Big key 一、緩存失效 問題描述 一次性緩存大量數據,設置了相同過期時間,同時失效。 解決方案 即相同業務數據寫緩存時,在基礎

原创 阿里四面:微信朋友圈設計原理

轉自:http://www.woshipm.com/pd/2701264.html 當你一秒鐘拍了張自拍,一個小時修了下圖,然後打開朋友圈,點擊發送的那一刻,後臺到底有多少工作在進行着? 我們太習以爲常,沒有意識到這背後還會有多複雜的邏輯

原创 Pipeline添加與刪除ChannelHandler

添加ChannelHandler ChannelHandler是在服務端啓動過程中,Channel初始化時通過addLast方法添加的。 public static void main(String[] args) throw