原创 構建器代替構造器

前言 靜態工廠方法和構造器有一個共同的侷限性:當有大量可選參數時,方法的數量會不受控制。 當有大量可選參數時,開發者一般採用方法重載的方式來編寫構造器,面對大量的構造器調用者往往不知所云,尤其是參數類型相同的情況下,調用者往往要跟

原创 手寫MyBatis分頁插件

目錄前言MyBatis插件手寫分頁插件總結 前言 在開發查詢類的接口時,有一個讓開發者比較頭疼的問題:分頁。 如果每次都要開發者自己去寫limit,計算起始行和偏移量就太煩了,於是市面上誕生了一些優秀的分頁插件,例如:PageHe

原创 線程間協作——等待與通知

文章目錄前言wait和notify存在的問題notify和notifyAll用哪個?生產者消費者實戰條件變量Condition 前言 系統的穩定運行,在單線程程序中得益於類與類之間的協作,在多線程程序中,還得益於線程與線程之間的協

原创 關於Java是否應該在循環外聲明變量的一點思考

目錄前言性能和內存性能測試內存測試編譯優化總結 前言 “不要把變量聲明在循環體內”,經常看到類似的言論,那麼到底有沒有必要這麼去做呢? 首先,將變量聲明在循環體外有以下幾個缺點: 作用域變大,存在被無意引用的風險 防止變量命名衝

原创 Solr7服務搭建及簡單使用

前言 最近在搭一套微服務環境,其中“帖子模塊”需要用到Solr的全文檢索和高亮查詢,服務搭建完畢後決定將Solr的服務搭建過程和查詢簡單記錄一下。 之前用Lucene實現過類似的功能,Solr也是基於Lucene的,但Solr是面

原创 爲什麼索引可以提升查詢速度?

官方定義:索引是幫助存儲引擎高效獲取數據的一種有序的數據結構。 提取句子主幹:索引是有序的數據結構。 基於快速查找的數據結構有很多,MySQL採用的是 B+Tree。 爲什麼採用B+Tree而不是其他的呢? B+Tree相比其他數

原创 Java逃逸分析之棧上分配內存

目錄什麼是逃逸分析?棧上分配內存 什麼是逃逸分析? 在很早以前,Java代碼從編寫完畢到JVM執行至少需要兩個過程: javac將Java代碼編譯成字節碼class文件。 JVM載入class文件後,由解釋器來逐條將字節碼指令解

原创 實現簡單的Spring容器

在學習Spring的時候,常聽到的兩個東西:IOC和DI。 IOC:控制反轉,將對象的生命週期交給Spring去維護,我們需要對象時從容器中拿。 DI:依賴注入,類與類之間的依賴關係也交給Spring去維護。例如:A依賴B,程序運

原创 手寫MyBatis數據庫連接池

1、資源池(Pool)技術 資源池(Resource Pool)是一種設計模式,預先構建好N個資源,需要的時候直接從池子裏面拿,用完再放回去。 預先構建好資源,節省了構建資源的時間,可以提升應用程序的響應速度。 資源使用完畢後放回

原创 關於CAS的一點理解和思考

文章目錄CASJava中的CAS操作加鎖和CAS性能測試比較CAS不同線程數量下的額外開銷 CAS CAS(Compare And Swap)是對一種處理器指令的稱呼,中文譯爲:比較並交換。 它需要三個參數:內存地址V、期望的舊值

原创 Java鎖的膨脹過程以及一致性哈希對鎖膨脹的影響

1、鎖優化 在JDK6之前,通過synchronized來實現同步效率是很低的,被synchronized包裹的代碼塊經過javac編譯後,會在代碼塊前後加上monitorenter和monitorexit字節碼指令,被synch

原创 基於AQS實現自定義鎖

AQS 全稱:AbstractQueuedSynchronizer,譯爲:抽象隊列同步器。 AQS是很多併發工具類的基礎,可以說是實現整個java.util.concurrent併發包的半壁江山。 public abstract

原创 用靜態工廠方法代替構造器

參考於《Effective Java》 前言 對於類而言,獲得其實例最常見的方式就是提供一個構造器。 如果我們不寫構造器,編譯器會幫我們自動加上一個被public修飾的空構造器。 除了提供構造器以外,靜態工廠方法也應該被考慮到

原创 Java實現鎖的幾種方式

鎖和同步,學習多線程避不開的兩個問題,Java提供了synchronized關鍵字來同步方法和代碼塊,還提供了很多方便易用的併發工具類,例如:LockSupport、CyclicBarrier、CountDownLatch、Sem

原创 Lock和Condition實現等待通知

Condition接口 目的:替代傳統的Object的wait()、notify()。 相較於Object的wait()、notify(),使用Condition的await()、signal()來實現線程間的協作更加的安全,效率