技術(shù)總結(jié)

設(shè)計模式:
1.單例模式
最簡單的單例涂屁,應(yīng)用場景(spring bean默認實現(xiàn)singleton模式,其他模式是clone模式prototype,session甸怕,request甘穿,global session )
public class Single{
private static Single INS = null;
private Single(){
}

public static Single getIns(){
      if(INS ==null) {
        INS = new Single();
  }
    return INS;
}

}
這才是最簡單的
public class Single{
private static Single INS = new Single();
private Single(){
}

public static Single getIns(){
    return INS;
}

}

2.工廠模式(Simple factory 常見簡單工廠)
public class SimpleFactory{
public static createA(){
return new A();
}
public static createB(){
return new B();
}
}

3.抽象工廠(Abstract Factory Spring beanFactory)
public class AbstaractFactory{
IA createA();

   IB createB()梢杭;

}

public class MFactory impl AbstaractFactory{
IA createA()温兼;

   IB createB();

}

public class NFactory impl AbstaractFactory{
IA createA()武契;

   IB createB()募判;

}

4.代理模式(dubbo 動態(tài)代理)

public class AObjAgent{
AObj obj = new AObj();
public String test(){
obj .test();
}
}
public class AObj{
public String test(){}
}

5.委托模式
近似等于代理模式

6.裝飾者模式(繼承添加新接口)
核心思想,繼承拓展
簡化版
public class A{
public void m(){}
}

public class B extend A{
public void n(){}
}
復(fù)雜版
public interface A{
public void m()咒唆;
}

public class AClass{
public void m(){}
}
public interface B extend A{
public void n();
}

public class B extend AClass{
public void n(){}
}

7.責(zé)任鏈模式(過濾器,攔截器)
public interface Filter {
public void doFilter(FilterChain chain);
}
public class FilterChain {

private List<Filter> list = new ArrayList<>();

private int index = 0;

public FilterChain addFilter(Filter filter){
    list.add(filter);
    return this;
}

public void doFilter(){
    if (index == list.size()) {return;}
    this.list.get(index++).doFilter(this);
}

}
public class AFilter implements Filter{

@Override
public void doFilter(FilterChain chain){
    System.out.println("A");
    chain.doFilter();
}

}

public class BFilter implements Filter{

@Override
public void doFilter(FilterChain chain){
    System.out.println("B");
    chain.doFilter();
}

}

8.建造者模式(StringBuilder兩種建造者)
復(fù)雜的邏輯封裝到方法里兰伤,隱藏構(gòu)建的過程
builder
public class A{}

public class builder{
public build(){
return new A();
}
}

  1. 橋接模式(WebApplicationContext 子類抽象類)
    邏輯封裝 子類傳入
    public interface AInterface{
    public void aMethod();
    }
    public class A impl AInterface{
    public void aMethod(){
    }
    }
    public class B impl AInterface{
    public void aMethod(){
    }
    }

public abstract class Handler {
protected AInterface a;
public Handler(AInterface a){
this.a = a;
}
protected abstract void runA();
}
public class TestHandler {

public Handler(int i ,AInterface a){
super(a);

}
protected void runA(){
a.aMethod();
}
}
10.適配器模式Adapter

新老業(yè)務(wù)做橋接

public class A{
public void aMethod(String arg1,String arg2);
public void aMethod();

}
public interface BInterface{
public void bMethod(String arg1);
}
public class BAdapter impl AInterface{
A a = new A();
public void aMethod(String arg1){
a.aMethod(arg1,null);
a.aMethod();
}
}

11.原型模式 clone已有的對象(spring bean)
public class A impl cloneable{

}

public class Main(){
private A a = new A();

 public static void main(String[] args){
    a=A.clone();      

}
}

12.命令模式 封裝指令

String test = "test";

if(test){

}
13.享元模式 線程池
降低內(nèi)存損耗
線程池
14.觀察者模式 事件-通知機制(兩個實現(xiàn),觀察者模式)
事件模式

15.策略模式(一個接口多個實現(xiàn),dubbo里面的mina框架,netty框架被封裝成統(tǒng)一的接口,一個接口對應(yīng)多個網(wǎng)絡(luò)層實現(xiàn))
16.模板模式(邏輯封裝在父類里)

spring bean的實現(xiàn)
由compontentScan來掃描 spring默認xml中配置為< compontent-scan>標(biāo)簽標(biāo)識包掃描路徑
此時compontent/controller/service/Repository注解會被掃描到內(nèi)存中
xml解析器(yml解析器或者其他解析器)解析bean定義,通過反射方式生成bean對象 springioc基本原理
@Bean注解方式 由開發(fā)者指定bean的定義钧排,spring決定何時調(diào)用得到對象

rpc restful
rpc 代表 dubbo 將本地方法映射到遠端 強調(diào)的主體是 動作
1.強制約定了對于接口的調(diào)用參數(shù)敦腔,接口定義
2.基于同種語言調(diào)用

restful 代表 spring cloud 體現(xiàn)的思想是 萬物皆資源 http接口返回json為代表一系列接口

  1. 依托于api文檔
    2.不同語言之間可以互相調(diào)用系統(tǒng)解耦更方便

設(shè)計模式六大原則:
1.開閉原則(對修改關(guān)閉,對拓展開放)
2.依賴倒置原則(依賴于接口恨溜,而不依賴于具體實現(xiàn))
3.單一職責(zé)原則(一個對象只實現(xiàn)一項功能)
4.里氏替換原則(所有父類能出現(xiàn)的地方符衔,子類一定能出現(xiàn),里氏替換原則是抽象的基石)
5.合成復(fù)用原則(對象之間的組合盡可能的采用組合的方式而不是繼承)
6.最小依賴原則(一個類盡可能少的依賴其他對象糟袁,減少系統(tǒng)的耦合性)

gc:
可達性分析
1.引用計數(shù)
2.可達性分析
gc常用的算法有
1.標(biāo)記清除算法(標(biāo)記垃圾對象-清除判族,缺點易造成內(nèi)存碎片,優(yōu)點速度快)
2.標(biāo)記整理算法(標(biāo)記垃圾對象,將非垃圾對象向內(nèi)存區(qū)一端移動项戴,再將臨界點之外的內(nèi)存區(qū)清除形帮,速度緩慢,但會有效減少內(nèi)存碎片周叮,容易形成連續(xù)的內(nèi)存區(qū))
3.復(fù)制算法(標(biāo)記垃圾對象,將非垃圾對象標(biāo)記復(fù)制到另一個內(nèi)存區(qū)辩撑,將原內(nèi)存區(qū)清除,缺點需要雙倍內(nèi)存區(qū)仿耽,優(yōu)點當(dāng)費垃圾對象較少時速度快)
4.分代收集算法(老年代新生代2:8,新生代采用標(biāo)記清除算法,老年代采用標(biāo)記整理算法合冀,新生代到老年代晉級多次,當(dāng)在新生代一定閾值存活之后采用復(fù)制算法)其中新生代稱之為(Eden伊甸區(qū)(天堂死的快的么^^)项贺,取名字伊甸園,survivor老年代君躺,又叫幸存區(qū))
現(xiàn)在沿用的收集器
CMS收集器 +XX:+UseParNewGC(我特么最開始寫+UseCMSGC 囧) 收集過程 初始標(biāo)記,并發(fā)標(biāo)記峭判,重新標(biāo)記,并發(fā)清除四個過程棕叫、
G1收集器: -XX:+UnlockExperimentalVMOptions -XX:+UseG1GC 然后把 相較于CMS收集器的改進是:
1.內(nèi)存分代不隔離

  1. 可預(yù)測停頓

java8 默認GC Parallel GC
java9 默認GC 是G1

Full GC 和 Minor GC
Minor GC Eden區(qū)GC
Full GC 清理整個內(nèi)存空間
Major GC 老年代GC 一般來說 MinorGC 會出發(fā)FullGC

觸發(fā)Full GC的條件

  1. System.gc()
  2. 老年代不足
  3. 永久帶不足
  4. 新生代晉升老年代空間不足
  5. 堆中分配大對象,空間不足以分配

CMS收集器的收集過程
初始標(biāo)記——>并發(fā)標(biāo)記——>重新標(biāo)記——>并發(fā)清除

即時編譯JIT機制和編譯優(yōu)化
1.即時編譯JIT林螃,熱點代碼編譯成本地平臺機器碼
算法兩種:1采樣定期采集棧頂方法 2. 定期統(tǒng)計(xx時間內(nèi)打到xx次,過時減半)
兩種
1俺泣。熱點方法編譯

  1. 回邊方法編譯(回邊方法指的是:在代碼執(zhí)行流控制(跳轉(zhuǎn))的時候進行計數(shù)治宣,達到一定閾值后編譯整個方法)

ClassLoader

redis:
redis分布式鎖的實現(xiàn):setNx指令

redis的數(shù)據(jù)結(jié)構(gòu)有:string hash list set sortedSet

CAP原則:
C 強一致性
A 可用性
P 分區(qū)容錯性
定律:一個系統(tǒng)不可能三個同時滿足,而只能同時達到三大原則中的兩個

滿足CA RDS mysql/sqlserver等關(guān)系型數(shù)據(jù)庫
滿足CP nosql為代表的 redis/mongodb/cache框架
滿足AP 一些簡單的數(shù)據(jù)庫simple db

關(guān)系型數(shù)據(jù)庫的原則為 CAP原則的變種 稱之為ACID
其中 A 原子性
C 一致性
I 隔離性(獨立性)
D 持久性

說說鎖
樂觀鎖和悲觀鎖
悲觀鎖
悲觀鎖往往認為不加鎖我完全沒辦法進行下一步操作
我所有數(shù)據(jù)隨時有可能因為線程被掛起而會出現(xiàn)錯誤的數(shù)據(jù)
悲觀鎖的性能:在java中 線程的切換往往需要由用戶態(tài)轉(zhuǎn)換成系統(tǒng)太去完成線程的切換操作
其中完成了這樣幾部操作砌滞,保存線程A的CPU寄存器信息——>存儲到CIP中——>從CIP中讀取線程B的寄存器信息——>恢復(fù)執(zhí)行線程B
在這其中 有可能耗費的時間比線程本身生命周期的時間還要長所以非常耗費性能
代表有synchronized,reentractLock 其中在java8中兩者的性能耗費基本相同侮邀,但是 reentractLock中有一些高級特性

  1. 可以設(shè)置公平鎖或者非公平鎖
  2. 可以設(shè)置多個condition

在線程執(zhí)行過程中,往往可能在線程掛起的下一瞬間贝润,線程所競爭的資源就會被釋放绊茧,而當(dāng)線程下一次再被執(zhí)行則需要好久,所以在java6以后進行線程的synchronized打掘,reentractLock 和都會進行優(yōu)化先進行自旋一段時間华畏,當(dāng)不能競爭到鎖時再去進行線程掛起等待被喚醒
樂觀鎖
樂觀鎖在設(shè)計中認為隨時可能資源被釋放,而掛起線程是在浪費時間尊蚁,因為當(dāng)線程掛起的一瞬間鎖就有可能被釋放亡笑,所以樂觀鎖的設(shè)計是盡可能的不去掛起線程,而是假設(shè)程序在執(zhí)行過程中都是沒有沖突的横朋,當(dāng)沖突出現(xiàn)的時候盡可能的去嘗試獲取資源仑乌,直到得到資源典型代表就是CAS(Compare and Swap)
CAS
CAS在計算機中是一個CPU指令的應(yīng)用(Compare and swap) 該指令是一個三操作數(shù)的指令 V A B即 內(nèi)存地址 新值 舊值
其中在 x64和 x86 中是 comxchg執(zhí)行來執(zhí)行

在CAS中有一個bug 稱之為ABA問題,即當(dāng)A值被改變成B值之后又被改回A值 CAS會認為值沒有改變但是實際上值已經(jīng)被改變過了
解決方案是同時去改變兩個值即給CAS的值是兩個參數(shù)一個版本號一個目標(biāo)值

公平鎖和非公平鎖
注意:這些劃分只是單純的從某個緯度去劃分的琴锭,一個鎖可能具備一個或多個特性
公平鎖晰甚,當(dāng)鎖釋放之后所有線程公平競爭沒有優(yōu)先級任何一個線程都有可能獲得當(dāng)前鎖并執(zhí)行,有的線程可能永遠無法獲取到鎖
reentractLock 通過構(gòu)造函數(shù)可以被構(gòu)建成公平鎖

非公平鎖决帖,當(dāng)鎖釋放之后線程會按照一定優(yōu)先級來競爭鎖(時間厕九,權(quán)重等)
synchronized就是一個非公平鎖
reentractLock 默認也是非公平鎖,可以通過boolean的構(gòu)造函數(shù)來構(gòu)造出公平鎖
可重入鎖和自旋鎖
可重入鎖地回,一個線程持有該鎖之后扁远,該線程下的子代碼也持有該鎖而無需再次獲取,又叫遞歸鎖
自旋鎖,當(dāng)一個代碼獲取到鎖之后刻像,其他代碼訪問該鎖的時候不斷嘗試(循環(huán))獲取該鎖而不是中斷

讀寫鎖
reentractReadWriteLock
讀寫鎖允許多個線程同時讀畅买,但只允許同一個線程同時寫

輕量鎖和重量鎖
是否會阻塞線程為標(biāo)準(zhǔn)(劃重點)阻塞線程的叫重量級鎖,不阻塞的叫輕量級鎖

偏向鎖
大多數(shù)情況下 鎖不僅不存在線程競爭并且是由同一個線程多次獲取绎速,為了減小鎖獲取的代價

偏向鎖的理解:
當(dāng)一個線程被初始化的時候偏向鎖是無狀態(tài)的皮获,當(dāng)一個線程訪問該對象的時候焙蚓,檢查偏向鎖纹冤,將該對象的偏向鎖的threadId改成自己的洒宝,當(dāng)再次訪問該對象的時候直接比對偏向鎖的threadId如果是自己的則不用獲取鎖,如果不是自己的則喚醒持有該鎖的線程萌京,如果線程不存活雁歌,則直接將偏向鎖記錄的id改成自己的,如果線程存活知残,則讓其繼續(xù)執(zhí)行完這一段代碼靠瞎,這時候偏向鎖升級為輕量級鎖,即有沖突但沖突程度很輕求妹,這個時候如果第三個線程進來了乏盐,則認為該鎖競爭程度很大,則將除了持有鎖的其它線程全部阻塞制恍,此時輕量級鎖升級為重量級鎖

Mark Word 當(dāng)前對象狀態(tài)

對象頭信息:
偏向鎖 地址

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末父能,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子净神,更是在濱河造成了極大的恐慌何吝,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,858評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件鹃唯,死亡現(xiàn)場離奇詭異爱榕,居然都是意外死亡,警方通過查閱死者的電腦和手機坡慌,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評論 3 395
  • 文/潘曉璐 我一進店門黔酥,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人洪橘,你說我怎么就攤上這事絮爷。” “怎么了梨树?”我有些...
    開封第一講書人閱讀 165,282評論 0 356
  • 文/不壞的土叔 我叫張陵坑夯,是天一觀的道長。 經(jīng)常有香客問我抡四,道長柜蜈,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,842評論 1 295
  • 正文 為了忘掉前任指巡,我火速辦了婚禮淑履,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘藻雪。我一直安慰自己秘噪,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,857評論 6 392
  • 文/花漫 我一把揭開白布勉耀。 她就那樣靜靜地躺著指煎,像睡著了一般蹋偏。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上至壤,一...
    開封第一講書人閱讀 51,679評論 1 305
  • 那天威始,我揣著相機與錄音,去河邊找鬼像街。 笑死黎棠,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的镰绎。 我是一名探鬼主播脓斩,決...
    沈念sama閱讀 40,406評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼畴栖!你這毒婦竟也來了俭厚?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,311評論 0 276
  • 序言:老撾萬榮一對情侶失蹤驶臊,失蹤者是張志新(化名)和其女友劉穎挪挤,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體关翎,經(jīng)...
    沈念sama閱讀 45,767評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡扛门,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了纵寝。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片论寨。...
    茶點故事閱讀 40,090評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖爽茴,靈堂內(nèi)的尸體忽然破棺而出葬凳,到底是詐尸還是另有隱情,我是刑警寧澤室奏,帶...
    沈念sama閱讀 35,785評論 5 346
  • 正文 年R本政府宣布火焰,位于F島的核電站,受9級特大地震影響胧沫,放射性物質(zhì)發(fā)生泄漏昌简。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,420評論 3 331
  • 文/蒙蒙 一绒怨、第九天 我趴在偏房一處隱蔽的房頂上張望纯赎。 院中可真熱鬧,春花似錦南蹂、人聲如沸犬金。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,988評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽晚顷。三九已至峰伙,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間音同,已是汗流浹背词爬。 一陣腳步聲響...
    開封第一講書人閱讀 33,101評論 1 271
  • 我被黑心中介騙來泰國打工秃嗜, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留权均,地道東北人。 一個月前我還...
    沈念sama閱讀 48,298評論 3 372
  • 正文 我出身青樓锅锨,卻偏偏與公主長得像叽赊,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子必搞,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,033評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法必指,類相關(guān)的語法,內(nèi)部類的語法恕洲,繼承相關(guān)的語法塔橡,異常的語法,線程的語...
    子非魚_t_閱讀 31,639評論 18 399
  • 從三月份找實習(xí)到現(xiàn)在霜第,面了一些公司葛家,掛了不少,但最終還是拿到小米泌类、百度癞谒、阿里、京東弹砚、新浪、CVTE枢希、樂視家的研發(fā)崗...
    時芥藍閱讀 42,253評論 11 349
  • 我覺得生命是最重要的,所以在我心里读存,沒有事情是解決不了的。不是每一個人都可以幸運的過自己理想中的生活呕屎,有樓有車當(dāng)然...
    聽聽歌睡睡覺閱讀 299評論 0 8
  • 最近總是胡思亂想让簿,盼望著他的到來。 可心理怕怕的秀睛,總感覺失敗了,精子還是精子,卵子還是卵子锐帜,它們沒有相遇,沒有造出...
    長頸鹿的小毛鬃閱讀 107評論 0 0