原创 單分派、雙分派及兩種設計模式

# 什麼是單分派和雙分派分派(dispatch) 是指按照對象的實際類型爲其綁定對應方法體的過程。 例如有X類及其兩個子類X1、X2,它們都實現了實例方法m()——通常子類X1、X2的方法前應該加@Override,所以有3個m()。 對於

原创 Mybatis是如何跟Spring整合的

寫在前面 Mybatis官網中,有這麼一節專門介紹如何注入一個mapper 對於單個mapper,有兩種方式可以注入,分別是xml和註解 其中,xml這種方式耐人尋味。 <bean id="userMapper" class="org.m

原创 那些年,我們遇到的OOM

JVM內存模型 先聊聊jvm內存模型,在網上找到一張有直接內存的圖片,方便後面討論 這張圖真是常看常新,今天我們從內存溢出的角度重新再審視一遍。方法區,也稱非堆,hotspot中,1.7叫perm區,1.8叫元空間,因此這個區域溢出,1.

原创 cpu idle過低問題

工作中,如果機器cpu idle過低,會收到告警 P2主機名: set-xr-xxxx監控項: all(#5) cpu.idle < 30 當前值: 0 排查的步驟如下, 使用top + 大寫P,查看cpu佔用過高的進程 這裏往往就是後臺

原创 方法區到底是個什麼鬼

一、方法區與永久代 這兩個是非常容易混淆的概念,永久代的對象放在方法區中,就會想當然地認爲,方法區就等同於持久代的內存區域。事實上兩者是這樣的關係: 《Java虛擬機規範》只是規定了有方法區這麼個概念和它的作用,並沒有規定如何去實現它。那麼

原创 從Thread.join說開去

WAITING(TIMED_WAITING) 與 BLOCKED看《Java特種兵》的時候發現,Thread.join可以使線程進入WAITING狀態,再結合姊妹篇線程的狀態我們可以瞭解到,有兩個類狀態非常接近:WAITING(TIMED_

原创 線程的狀態

Thread.State首先看JDK中的代碼: java.lang.Thread.State /** * A thread state. A thread can be in one of the following s

原创 線程池底層原理

目錄 概述 JAVA通過多線程的方式實現併發,爲了方便線程池的管理,JAVA採用線程池的方式對線線程的整個生命週期進行管理。1.5後引入的Executor框架的最大優點是把任務的提交和執行解耦。 要執行任務的人只需把Task描述清楚,然後提

原创 gof23行爲類模式(golang版)

命令模式 命令模式是一個高內聚的模式,其定義:將一個請求封裝成一個對象,從而讓你使用不同的請求把客戶端參數化,對請求排除或者記錄請求日誌,可以提供命令的撤銷和恢復功能。 命令模式包含如下角色: Command: 抽象命令類需要執行的所有

原创 gof23結構類模式(golang版)

適配器模式 Adapter模式也被稱爲Wrapper模式,有以下兩種: 類適配器(使用繼承) https://design-實現目標接口,繼承被適配類 對象適配器(使用委託) 繼承目標類,依賴被適配類 參考http://blog.51c

原创 gof23創建類模式(golang版)

區塊鏈的征程已開啓 單例模式 Java中的單例模式的實現可以有餓漢式、懶漢式、雙鎖、靜態內部類、枚舉等形式,在go中如何實現單例呢,先來最簡單的形式,不考慮高併發的情況下,應該怎樣實現 package main var m *Single

原创 golang之樹的遍歷

go語言在區塊鏈編程中有巨大的優勢,其中fabric和ethereum都是基於go語言編寫的。爲了能更好的學習區塊鏈的底層技術,先將go的基礎打好。 本篇文章使用golang來實現樹的遍歷 樹的定義 package tree type N