原创 【多線程】Semaphore實現原理

前言 Semaphore,信號量,一般用於控制同時訪問資源的線程數量。可以認爲Synchronized代表的是一把鎖,那麼Semaphore就是多把鎖。 常用方法 public class Semaphore implements ja

原创 說說線程池

前言 線程池內部是多個線程的集合,在創建初期,線程池會創建出多個空閒的線程,當有一個任務需要執行時,線程池會選擇出一個線程去執行它,執行結束後,該線程不會被銷燬,而是可以繼續複用。 使用線程池可以大大減少線程頻繁創建與銷燬的開銷,降低了系

原创 【多線程】CyclicBarrier實現原理

前言 CyclicBarrier,字面意思“循環屏障”,用於多個線程一起到達屏障點後,多個線程再一起接着運行的情況。例如,線程1和線程2一起運行,線程1運行到屏障點a時,將會被阻塞,等到線程2運行到屏障點a後,線程1和線程2纔可以打破屏障

原创 一步一步推導出 Mysql 索引的底層數據結構

Mysql 作爲互聯網中非常熱門的數據庫,其底層的存儲引擎和數據檢索引擎的設計非常重要,尤其是 Mysql 數據的存儲形式以及索引的設計,決定了 Mysql 整體的數據檢索性能。 我們知道,索引的作用是做數據的快速檢索,而快速檢索的實現的

原创 【多線程】CountDownLatch實現原理

前言 CountDownLatch是多線程中一個比較重要的概念,它可以使得一個或多個線程等待其他線程執行完畢之後再執行。它內部有一個計數器和一個阻塞隊列,每當一個線程調用countDown()方法後,計數器的值減少1。當計數器的值不爲0時

原创 【多線程】淺探CAS實現原理

前言 CAS,全稱是Compare And Swap,即比較並交換,是一種樂觀鎖的實現。 悲觀鎖與樂觀鎖 悲觀鎖 總是假設最壞的情況,線程a每次去獲取或更新數據的時候,都會覺得別的線程也正在修改這個數據,爲了避免自己的更新操作丟失,線程a

原创 【JVM】對象的內存佈局,怎樣確定對象的大小

一個對象在內存中究竟是怎樣進行佈局的,如何依據代碼去確定對象佔據的大小,本文將進行粗略地探討。 對象在內存中的佈局,主要有3個組成部分,包括對象頭,實例數據與對齊填充。確定對象的大小,也是從這3個組成部分的入手。 對象頭 其中對象頭中又包

原创 【JVM】class文件結構2——類索引、超類索引與接口表索引

1、類索引 類索引緊隨在類訪問標記之後,佔兩個字節,裏面存儲一個指向常量池的一個索引,用於指出該class文件的全限定名。 以下面這個簡單的java類爲例: package com.yang.testFlag; public clas

原创 【JVM】class文件結構1——魔數、版本號、常量池與類訪問標記

1、魔數 我們可以利用editplus,以16進制的編碼格式來查看class文件的結構,具體操作方法爲在editplus的工具欄中點擊Edit,下拉選擇Hex Viewer即可。 如圖所示,前四(4個bit位*8個字母=32,32/8=

原创 【JVM】class文件結構3——字段表與方法表

1、字段表 字段表緊隨在接口表索引之後,字段表包含訪問標記、字段名索引、描述符索引、屬性表,其中屬性表包含屬性計數器與屬性集合 以這段代碼爲例: package com.yang.testField; public class Mai

原创 【Mysql】回表與覆蓋索引是神魔鬼?

select id,name where name='shenjian' select id,name,sex* where name='shenjian'* 多查詢了一個屬性,爲何檢索過程完全不同? 什麼是回表查詢? 什麼是索引覆蓋?

原创 【JVM】類加載器與雙親委派模型

類加載器在加載階段,會將class文件加載進方法區。有關類加載的全過程,可以先參考我的另外一篇文章類的奇幻漂流——類加載機制探祕 類加載器的類型 類加載器有以下種類: 啓動類加載器(Bootstrap ClassLoader) 擴展類加載

原创 【JVM】虛擬機棧的五臟六腑

虛擬機棧,本身就是一個普通的棧,棧中的元素叫做棧幀。 虛擬機棧是線程私有的,每有一個線程,虛擬機就會創建一個虛擬機棧,線程與虛擬機棧一一對應。線程每調用一個方法,虛擬機就會創建一個棧幀,並將此棧幀壓入虛擬機棧中,當方法調用結束後,此棧幀又

原创 【JVM】類的奇幻漂流——類加載機制探祕

我們寫的類,在編譯完成後,究竟是怎麼加載進虛擬機的?虛擬機又做了什麼神奇操作?本文可以帶着讀者初探類加載機制。上來先放類加載各個階段的主要任務,用於給讀者一個大概的印象體驗,現在記不住也沒有什麼關係。 現在只需要記住三個名詞,裝載——>連

原创 JUC基石——Unsafe類

前言 我們經常在JUC包下的ConcurrentHashMap、Atomic開頭的原子操作類、AQS以及LockSupport裏面看到Unsafe類的身影,這個Unsafe類究竟是幹什麼的,本文可以帶着讀者一探究竟。 Java和C++、