異步原理以及實(shí)現(xiàn)方式
參考文檔:https://www.cnblogs.com/haiyoune2/p/9243693.html
原理
- 同步和異步通信
- 步調(diào)用不阻塞線(xiàn)程,而是把調(diào)用塞到線(xiàn)程池中矾兜,程序主線(xiàn)程或UI線(xiàn)程可以繼續(xù)執(zhí)行
- 異步是借助于多線(xiàn)程來(lái)實(shí)現(xiàn)的
- 一句話(huà)概括:程序無(wú)須按照代碼順序自上而下執(zhí)行
實(shí)現(xiàn)方式
- C# 5.0 新增async/await關(guān)鍵字咱枉,可以簡(jiǎn)化異步編程
- 使用async關(guān)鍵字窍荧,對(duì)方法標(biāo)記為異步(async本身不會(huì)創(chuàng)建異步操作,如果沒(méi)有await關(guān)鍵字卑雁,編譯器會(huì)警告但不報(bào)錯(cuò),將以同步形式執(zhí)行程序)
- BeginInvoke實(shí)現(xiàn)
- Timer定時(shí)器實(shí)現(xiàn)
多線(xiàn)程原理以及跨線(xiàn)程交互實(shí)現(xiàn)方式
多線(xiàn)程原理
什么是進(jìn)程地熄?
當(dāng)一個(gè)程序開(kāi)始運(yùn)行時(shí)叉讥,它就是一個(gè)進(jìn)程窘行,進(jìn)程包括運(yùn)行中的程序和程序所使用到的內(nèi)存和系統(tǒng)資源。 而一個(gè)進(jìn)程又是由多個(gè)線(xiàn)程所組成的图仓。什么是線(xiàn)程罐盔?
線(xiàn)程是程序中的一個(gè)執(zhí)行流,每個(gè)線(xiàn)程都有自己的專(zhuān)有寄存器(棧指針救崔、程序計(jì)數(shù)器等)惶看,但代碼區(qū)是共享的,即不同的線(xiàn)程可以執(zhí)行同樣的函數(shù)六孵。什么是多線(xiàn)程纬黎?
多線(xiàn)程是指程序中包含多個(gè)執(zhí)行流,即在一個(gè)程序中可以同時(shí)運(yùn)行多個(gè)不同的線(xiàn)程來(lái)執(zhí)行不同的任務(wù)劫窒,也就是說(shuō)允許單個(gè)程序創(chuàng)建多個(gè)并行執(zhí)行的線(xiàn)程來(lái)完成各自的任務(wù)本今。
跨線(xiàn)程交互實(shí)現(xiàn)方式
基于委托方式進(jìn)行實(shí)現(xiàn)
private delegate void DelegateInfo();
private delegate void DelegateIsEnd();
//這個(gè)是線(xiàn)程調(diào)用其他線(xiàn)程的方法
private void Dowork()
{
// 判斷是否需要Invoke,多線(xiàn)程時(shí)需要
if (this.InvokeRequired)
{
// 通過(guò)委托調(diào)用寫(xiě)主線(xiàn)程控件的程序主巍,傳遞參數(shù)放在object數(shù)組中
this.Invoke(new DelegateInfo(LoadFile));
}
else
{
// 如果不需要委托調(diào)用冠息,則直接調(diào)用
this.LoadFile();
}
//=========線(xiàn)程結(jié)束===========
this.BeginInvoke(new DelegateIsEnd(ISEnd));
}
private void ISEnd()
{
wf.Visible = false;
wf.Close();
wf.Dispose();
}
private void LoadFile()
{
}
private WaitingForm wf = nu
GC原理以及實(shí)現(xiàn)方式
GC原理
簡(jiǎn)單來(lái)說(shuō),是標(biāo)記與清除
- 標(biāo)記
從應(yīng)用程序的root出發(fā)孕索,利用相互引用關(guān)系逛艰,遍歷其在Heap上動(dòng)態(tài)分配的所有對(duì)象,沒(méi)有被引用的對(duì)象不被標(biāo)記檬果,即成為垃圾瓮孙;存活的對(duì)象被標(biāo)記,即維護(hù)成了一張“根-對(duì)象可達(dá)圖”选脊。 - 清除
啟用Compact算法杭抠,對(duì)內(nèi)存中存活的對(duì)象進(jìn)行移動(dòng),修改它們的指針恳啥,使之在內(nèi)存中連續(xù)偏灿,使空閑的內(nèi)存連續(xù),從而解決內(nèi)存碎片問(wèn)題钝的,當(dāng)再次為新對(duì)象分配內(nèi)存時(shí)翁垂,CLR不必在充滿(mǎn)碎片的內(nèi)存中尋找適合新對(duì)象的內(nèi)存空間,所以分配速度會(huì)大大提高硝桩。注意:大對(duì)象(large object heap)除外沿猜,GC不會(huì)移動(dòng)一個(gè)內(nèi)存中巨無(wú)霸,它會(huì)被放到一個(gè)特殊的內(nèi)存空間中碗脊。
IOC容器實(shí)現(xiàn)原理啼肩,DI實(shí)現(xiàn)方式
MVC
MVC生命周期
數(shù)據(jù)庫(kù)的鎖,netcore的鎖,數(shù)據(jù)庫(kù)索引祈坠,分布式相關(guān)
項(xiàng)目的架構(gòu) 分布式 oauth2 openid clr
Net core? 依賴(lài)注入害碾,什么是中間件?
AOP赦拘、多線(xiàn)程Task thread pool慌随,并發(fā)沖突
AOP面向切面編程
異常捕獲,如何控制線(xiàn)程的并發(fā)訪(fǎng)問(wèn)數(shù)量躺同?
各種數(shù)組類(lèi)型阁猜、數(shù)組與集合的區(qū)別。
什么是委托笋籽?Action與Function的區(qū)別蹦漠?
委托概述
委托是一種引用類(lèi)型,表示對(duì)具有特定參數(shù)列表和返回類(lèi)型的方法的引用车海。
Action與Function區(qū)別
- 相同:內(nèi)置委托類(lèi)型,顧名思義Action和Func本身就是已經(jīng)定義好的委托類(lèi)型隘击。
- 區(qū)別:Action委托簽名不提供返回類(lèi)型侍芝,而Func提供返回類(lèi)型。
Redis場(chǎng)景埋同?數(shù)據(jù)類(lèi)型州叠?為什么速度、分布式鎖凶赁? 大規(guī)模秒殺
如何保證緩存與數(shù)據(jù)庫(kù)雙寫(xiě)時(shí)的數(shù)據(jù)一致性咧栗?CAP
緩存雪崩和緩存穿透問(wèn)題解決?
數(shù)據(jù)庫(kù)的鎖類(lèi)型虱肄?共享 排他 更新鎖
數(shù)據(jù)庫(kù)系統(tǒng)角度
- 排他鎖
- 共享鎖(Share Lock)
- 多個(gè)事務(wù)可封鎖同一個(gè)共享頁(yè)
- 任何事務(wù)都不能修改該頁(yè)
- 通常是該頁(yè)被讀取完畢致板,讀鎖立即被釋放
- sqlserver使用 with(HOLDLOCK)
- 更新鎖
程序員角度
- 悲觀鎖
- 樂(lè)觀鎖
悲觀鎖和樂(lè)觀鎖的區(qū)別?如何實(shí)現(xiàn)樂(lè)觀鎖悲觀鎖咏窿?
索引 mysql索引的方式
事務(wù)隔離級(jí)別 默認(rèn)分布式事務(wù)
EF里如何避免臟讀
臟讀定義
- 當(dāng)一個(gè)事務(wù)正在訪(fǎng)問(wèn)數(shù)據(jù)斟或,并且對(duì)數(shù)據(jù)進(jìn)行了修改,而這種修改還沒(méi)有提交到數(shù)據(jù)庫(kù)中集嵌,這時(shí)萝挤,另外一個(gè)事務(wù)也訪(fǎng)問(wèn)這個(gè)數(shù)據(jù),然后使用了這個(gè)數(shù)據(jù)根欧。因?yàn)檫@個(gè)數(shù)據(jù)是還沒(méi)有提交的數(shù)據(jù)怜珍,那么另外一個(gè)事務(wù)讀到的這個(gè)數(shù)據(jù)是臟數(shù)據(jù),依據(jù)臟數(shù)據(jù)所做的操作可能是不正確的
如果避免臟讀
- 設(shè)置事務(wù)隔離級(jí)別TRANSACTION_READ_COMMITTED凤粗,常用防止臟讀
設(shè)計(jì)模式 k8s docker 隊(duì)列 linux
裝箱的底層原理酥泛;裝箱、拆箱過(guò)程中的性能損失,如何避免裝箱彼此相過(guò)程中的性能損失揭璃;
裝箱的底層原理
- 所有的值類(lèi)型都繼承自System.ValueType晚凿,而System.ValueType繼承自System.Object。
- 所有的值類(lèi)型對(duì)象都分配在堆棧上瘦馍,而所有的引用類(lèi)型包括System.Object對(duì)象都分配在堆上歼秽。
- CLR需要做額外的工作把堆棧上的值類(lèi)型移動(dòng)到堆上,這個(gè)操作就被稱(chēng)為裝箱情组。
- 在堆上分配一個(gè)內(nèi)存空間燥筷,大小等于需要裝箱的值類(lèi)型對(duì)象的大小加上兩個(gè)引用類(lèi)型對(duì)象都擁有的成員:類(lèi)型對(duì)象指針和同步塊引用。
- 把堆棧上的值類(lèi)型對(duì)象復(fù)制到堆上新分配的對(duì)象院崇。
- 返回一個(gè)指向堆上新對(duì)象的引用肆氓,并且存儲(chǔ)到堆棧上被裝箱的那個(gè)值類(lèi)型的對(duì)象里。
如何避免裝箱彼此相過(guò)程中的性能損失
- 盡量減少裝箱拆箱操作
- 通過(guò)泛型解決
- 在循環(huán)里外底瓣,提前進(jìn)行裝箱
多線(xiàn)程鎖的類(lèi)型
- 原子操作(Interlocked)
所有方法都是執(zhí)行一次原子讀取或一次寫(xiě)入操作谢揪。 - lock()
避免鎖定public類(lèi)型,否則實(shí)例將超出代碼控制的范圍捐凭,定義private對(duì)象來(lái)鎖定拨扶。 - Monitor實(shí)現(xiàn)線(xiàn)程同步
通過(guò)Monitor.Enter() 和 Monitor.Exit()實(shí)現(xiàn)排它鎖的獲取和釋放,獲取之后獨(dú)占資源茁肠,不允許其他線(xiàn)程訪(fǎng)問(wèn)患民。還有一個(gè)TryEnter方法,請(qǐng)求不到資源時(shí)不會(huì)阻塞等待垦梆,可以設(shè)置超時(shí)時(shí)間匹颤,獲取不到直接返回false。 - ReaderWriterLock
當(dāng)對(duì)資源操作讀多寫(xiě)少的時(shí)候托猩,為了提高資源的利用率印蓖,讓讀操作鎖為共享鎖,多個(gè)線(xiàn)程可以并發(fā)讀取資源站刑,而寫(xiě)操作為獨(dú)占鎖另伍,只允許一個(gè)線(xiàn)程操作。 - 事件(Event)類(lèi)實(shí)現(xiàn)同步
事件類(lèi)有兩種狀態(tài)绞旅,終止?fàn)顟B(tài)和非終止?fàn)顟B(tài)摆尝,終止?fàn)顟B(tài)時(shí)調(diào)用WaitOne可以請(qǐng)求成功,通過(guò)Set將時(shí)間狀態(tài)設(shè)置為終止?fàn)顟B(tài)因悲。- AutoResetEvent(自動(dòng)重置事件)
- ManualResetEvent(手動(dòng)重置事件)
- 信號(hào)量(Semaphore)
信號(hào)量是由內(nèi)核對(duì)象維護(hù)的int變量堕汞,為0時(shí),線(xiàn)程阻塞晃琳,大于0時(shí)解除阻塞讯检,當(dāng)一個(gè)信號(hào)量上的等待線(xiàn)程解除阻塞后琐鲁,信號(hào)量計(jì)數(shù)+1。線(xiàn)程通過(guò)WaitOne將信號(hào)量減1人灼,通過(guò)Release將信號(hào)量加1围段,使用很簡(jiǎn)單。 - 互斥體(Mutex)
獨(dú)占資源投放,用法與Semaphore相似奈泪。 - 跨進(jìn)程間的同步
通過(guò)設(shè)置同步對(duì)象的名稱(chēng)就可以實(shí)現(xiàn)系統(tǒng)級(jí)的同步,不同應(yīng)用程序通過(guò)同步對(duì)象的名稱(chēng)識(shí)別不同同步對(duì)象灸芳。