原创 對象池:commons-pool2源碼解析:GenericObjectPool的borrowObject方法

Apache Commons Pool庫提供了一整套用於實現對象池化的API,以及若干種各具特色的對象池實現。commons-pool2可認爲完全不同於commons-pool,裏面大部分核心邏輯實現都是完全不同的實現代碼。 Ap

原创 java io裏的BufferedInputStream爲什麼性能高

java io流的分類 從讀寫角度拆分 讀取流(InputStream、Reader的子類) 寫入流(OutputStream、Writer的子類) 按操作數據類型可分爲 字節流:所有InputStream、Outp

原创 mysql異常在spring、mybatis裏如何流轉的

兩個典型數據庫異常概覽 我們首先通過業務系統中發生過的兩種不同異常的堆棧的概要信息,來總結一些類同和差異。 unknown thread id異常片段 org.springframework.jdbc.Uncategoriz

原创 ClassLoader中那些傻傻分不清的概念

ClassLoader有幾種 根加載器 你的java程序想要運行,就必須有一個運行環境,這個運行環境既包括底層的jvm支持,還包括基礎的jre類庫支持。那麼這些基礎的jre類本省也是java的class,所以這些class的加載就

原创 多線程基礎知識點總結(一)

爲何使用多線程 單核環境下,I/O阻塞時可有效利用CPU資源 多核環境下,可以有效利用各個cpu資源。 如何創建線程 繼承Thread類,重寫run方法。 實現Runnable接口,實現run方法,new Thread(ru

原创 記一次 【Unknown thread id: XXX】 的排查

背景 線上一個服務偶爾會產生【Unknown thread id: XXX】異常 異常堆棧 org.springframework.jdbc.UncategorizedSQLException: ### Error updating

原创 JDK8:HashMap源碼解析:newNode方法、Node類

一、概述 在Map中存儲的每一個鍵值對都是以一個Map.Entry<K,V>的實現對象存儲的,Map.Entry是一個接口,不能實例化,所以Map的不同實現類,存儲鍵值對的方式也會有所不同,只要這個鍵值對的類實現了Map.Entry接口即

原创 JDK8:HashMap源碼解析:put方法

一、概述 Map的put方法接受兩個參數,key和value,該方法用於存儲鍵值對。 HashMap的put方法只有一行代碼:   return putVal(hash(key), key, value, false, true); /

原创 JDK8:HashMap源碼解析:resize方法

一、概述 HashMap的resize方法的作用:在向HashMap裏put元素的時候,HashMap基於擴容規則發現需要擴容的時候會調用該方法來進行擴容。   二、方法解析 final Node<K,V>[] resize() {

原创 JDK8:HashMap源碼解析:hash方法

一、概述 我們知道在HashMap中,一個鍵值對存儲在HashMap內部數據的哪個位置上和K的hashCode值有關,這也是因爲HashMap的hash算法要基於hashCode值來進行。 這裏要注意區分三個概念:hashCode值、ha

原创 JDK8:HashMap源碼解析:TreeNode類的balanceInsertion方法

一、概述 balanceInsertion指的是紅黑樹的插入平衡算法,當樹結構中新插入了一個節點後,要對樹進行重新的結構化,以保證該樹始終維持紅黑樹的特性。 關於紅黑樹的特性:   性質1. 節點是紅色或黑色。 性質2. 根節點是黑色。

原创 JDK8:HashMap源碼解析:TreeNode類的treeify方法

一、概述 treeify方法是TreeNode類的一個實例方法,通過TreeNode對象調用,實現該對象打頭的鏈表轉換爲樹結構。   二、方法解析 /** * 參數爲HashMap的元素數組 */ final void treeif

原创 JDK8:HashMap源碼解析:TreeNode類的find方法

一、概述 當我們向HashMap裏put一個鍵值對的時候,需要檢測鍵是否已經存在,如果存在需要替換值,如果不存在需要添加。當要添加的鍵產生了hash碰撞,並且碰撞位置上已經是一個樹結構時,那麼就需要檢查該鍵是否存在於該樹上,此時調用fin

原创 JDK8:HashMap源碼解析:remove方法、removeNode方法

一、概述 在HashMap中如果要根據key刪除這個key對應的鍵值對,需要調用remove(key)方法,該方法將會根據查找到匹配的鍵值對,將其從HashMap中刪除,並且返回鍵值對的值。 二、方法解析 我們先來看remove方法 /

原创 JDK8:HashMap源碼解析:comparableClassFor、compareComparables、tieBreakOrder方法

一、概述 在之前的文章裏已經分析過,在發生hash碰撞(多個key的hash值相同)的時候,hashMap首先會採用鏈表進行存儲,當鏈表節點數量達到一定閾值(8)會將鏈表上的節點再組織成一棵紅黑樹。紅黑樹是一種二叉樹,每個父節點可以由左右