設(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();
}
}
- 橋接模式(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為代表一系列接口
- 依托于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)存分代不隔離
- 可預(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的條件
- System.gc()
- 老年代不足
- 永久帶不足
- 新生代晉升老年代空間不足
- 堆中分配大對象,空間不足以分配
CMS收集器的收集過程
初始標(biāo)記——>并發(fā)標(biāo)記——>重新標(biāo)記——>并發(fā)清除
即時編譯JIT機制和編譯優(yōu)化
1.即時編譯JIT林螃,熱點代碼編譯成本地平臺機器碼
算法兩種:1采樣定期采集棧頂方法 2. 定期統(tǒng)計(xx時間內(nèi)打到xx次,過時減半)
兩種
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中有一些高級特性
- 可以設(shè)置公平鎖或者非公平鎖
- 可以設(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)
對象頭信息:
偏向鎖 地址