原创 java ArrayList的序列化分析

一、緒論 JAVA 序列化就是將 JAVA 對象以一種形式保持,比如存放到硬盤,或是用於傳輸。反序列化是序列化的一個逆過程。 JAVA 規定被序列化的對象必須實現 java.io.Serializable 這個接口,而我們分析的

原创 源碼解析-偏向鎖撤銷流程解讀

一、單個偏向鎖的撤銷 源碼鏈接:http://hg.openjdk.java.net/jdk8u/jdk8u/hotspot/file/9ce27f0a4683/src/share/vm/runtime/biasedLocking

原创 PCA降維原理

PCA 簡介 主成分分析(PCA)是最流行的降維算法,通過把數據從高維映射到低維來降低特徵維度,同時保留儘可能多的信息。 在進行圖像識別以及高維度數據降維處理中有很強的應用性,算法主要通過計算,選擇特徵值較大的特徵向量來對原始數據

原创 HotSpot VM 壓縮指針

現在基本上已經是 64 位機的時代了,內存單元的地址也是 64 位。 在 Java 中,除了 8 種基本類型,最常見的類型就是引用類型了,引用類型封裝了引用對象的指針。使用壓縮指針將 64 位長度的指針壓縮到 32 位,可以有效降

原创 關於 ConcurrentHashMap 1.8 中的線程探針哈希

ConcurrentHashMap 在累加鍵值對個數的 addCount 函數中,使用 ThreadLocalRandom.getProbe() 得到線程的探針哈希值。 在這裏,這個探針哈希值的作用是哈希線程,將線程和數組中的不用

原创 關於 CopyOnWriteArrayList 的一個簡單優化

一、優化動機 COW 簡介:增刪改都會加鎖並拷貝工作數組,在拷貝數組上做完增刪改操作後,會把拷貝數組切換爲工作數組,在這個過程中,不會阻塞讀操作。 所以 COW 很適合於讀多寫少的情況。 但是如果寫再多一點呢,或者大部分的增刪改只

原创 synchronized 各種鎖狀態

偏向鎖的論文中給出的,偏向鎖定下的鎖狀態轉換: 關於偏向鎖的原始論文,可以參考:HotSpot 偏向鎖,原始論文翻譯 可能發生的所有狀態轉換: 對象可能的初始鎖狀態只有 可偏向鎖 和 無鎖 兩種。 註釋:可偏向狀態,使用原始論文

原创 ConcurrentHashMap 1.8 計算 size 的方式

一、認識相關字段 相關字段, // 兩種情況 // 1. counterCells 數組未初始化,在沒有線程爭用時,將 size 的變化寫入此字段 // 2. 初始化 counterCells 數組時,沒有

原创 CopyOnWriteArrayList原理解析

CopyOnWriteArrayList是一個線程安全的ArrayList,對其進行的修改操作都是在底層的一個複製的數組(快照)上進行的,也就是使用了寫時複製策略。如圖所示是CopyOnWriteArrayList的類圖結構:

原创 MESI 緩存一致性協議(翻譯,中英對照)

內容來自《What Every Programmer Should Know About Memory》的 3.3.4 節 Multi-Processor Support。 這篇文章是按論文的格式寫的,與其說是文章,說是書更加合適

原创 Java 對象頭中你可能不知道的事

寫在前頭 本文將通過 jol 工具包和 OpenJDK 源碼來說明對象頭中 hashCode 的設置。 爲了不浪費大家的時間,先說結論: 對象創建完畢後,對象頭中的 hashCode 爲 0。 只有對象調用了從 Object 繼

原创 Java 壓縮指針

現在基本上已經是 64 位機的時代了,內存單元的地址也是 64 位。 在 Java 中,除了 8 種基本類型,最常見的類型就是引用類型了,引用類型封裝了引用對象的指針。使用壓縮指針將 64 位長度的指針壓縮到 32 位,可以有效降

原创 全排列、組合、組合總和、子集

聲明:把遞歸參數不變的,儘量統一設置爲成員變量。 一、全排列 全排列問題求解體系基本上分爲兩大類,一是基於選擇,二是基於交換。 1.1 全排列1:無重複 1.1.1 基於選擇的經典解法 優點是好記,遞歸時每次循環都從 0 開始。

原创 leetcode 215. 數組中的第K個最大元素

題目 求解 解法一:快速選擇算法 跟快速排序是一個人發明的,思想和快速排序一樣,平均時間複雜度爲 O(n)O(n)O(n)。 第一次是 O(n)O(n)O(n),第二次是 O(n/2)O(n/2)O(n/2),第三次是 O(n/

原创 leetcode 148. 排序鏈表

鏈表原地歸併排序,關鍵詞:二重循環、2倍 題目 求解 要求的常數級空間複雜度,不能用遞歸。 class Solution { public ListNode sortList(ListNode head) {