異步原理以及實現(xiàn)方式
參考文檔:https://www.cnblogs.com/haiyoune2/p/9243693.html
原理
- 同步和異步通信
- 步調(diào)用不阻塞線程,而是把調(diào)用塞到線程池中,程序主線程或UI線程可以繼續(xù)執(zhí)行
- 異步是借助于多線程來實現(xiàn)的
- 一句話概括:程序無須按照代碼順序自上而下執(zhí)行
實現(xiàn)方式
- C# 5.0 新增async/await關(guān)鍵字,可以簡化異步編程
- 使用async關(guān)鍵字,對方法標記為異步(async本身不會創(chuàng)建異步操作,如果沒有await關(guān)鍵字,編譯器會警告但不報錯,將以同步形式執(zhí)行程序)
- BeginInvoke實現(xiàn)
- Timer定時器實現(xiàn)
多線程原理以及跨線程交互實現(xiàn)方式
多線程原理
什么是進程?
當一個程序開始運行時,它就是一個進程,進程包括運行中的程序和程序所使用到的內(nèi)存和系統(tǒng)資源。 而一個進程又是由多個線程所組成的。什么是線程?
線程是程序中的一個執(zhí)行流,每個線程都有自己的專有寄存器(棧指針、程序計數(shù)器等),但代碼區(qū)是共享的,即不同的線程可以執(zhí)行同樣的函數(shù)。什么是多線程?
多線程是指程序中包含多個執(zhí)行流,即在一個程序中可以同時運行多個不同的線程來執(zhí)行不同的任務,也就是說允許單個程序創(chuàng)建多個并行執(zhí)行的線程來完成各自的任務。
跨線程交互實現(xiàn)方式
基于委托方式進行實現(xiàn)
private delegate void DelegateInfo();
private delegate void DelegateIsEnd();
//這個是線程調(diào)用其他線程的方法
private void Dowork()
{
// 判斷是否需要Invoke,多線程時需要
if (this.InvokeRequired)
{
// 通過委托調(diào)用寫主線程控件的程序,傳遞參數(shù)放在object數(shù)組中
this.Invoke(new DelegateInfo(LoadFile));
}
else
{
// 如果不需要委托調(diào)用,則直接調(diào)用
this.LoadFile();
}
//=========線程結(jié)束===========
this.BeginInvoke(new DelegateIsEnd(ISEnd));
}
private void ISEnd()
{
wf.Visible = false;
wf.Close();
wf.Dispose();
}
private void LoadFile()
{
}
private WaitingForm wf = nu
GC原理以及實現(xiàn)方式
GC原理
簡單來說,是標記與清除
- 標記
從應用程序的root出發(fā),利用相互引用關(guān)系,遍歷其在Heap上動態(tài)分配的所有對象,沒有被引用的對象不被標記,即成為垃圾;存活的對象被標記,即維護成了一張“根-對象可達圖”。 - 清除
啟用Compact算法,對內(nèi)存中存活的對象進行移動,修改它們的指針,使之在內(nèi)存中連續(xù),使空閑的內(nèi)存連續(xù),從而解決內(nèi)存碎片問題,當再次為新對象分配內(nèi)存時,CLR不必在充滿碎片的內(nèi)存中尋找適合新對象的內(nèi)存空間,所以分配速度會大大提高。注意:大對象(large object heap)除外,GC不會移動一個內(nèi)存中巨無霸,它會被放到一個特殊的內(nèi)存空間中。
IOC容器實現(xiàn)原理,DI實現(xiàn)方式
MVC
MVC生命周期
數(shù)據(jù)庫的鎖,netcore的鎖,數(shù)據(jù)庫索引,分布式相關(guān)
項目的架構(gòu) 分布式 oauth2 openid clr
Net core? 依賴注入,什么是中間件?
AOP、多線程Task thread pool,并發(fā)沖突
AOP面向切面編程
異常捕獲,如何控制線程的并發(fā)訪問數(shù)量?
各種數(shù)組類型、數(shù)組與集合的區(qū)別。
什么是委托?Action與Function的區(qū)別?
委托概述
委托是一種引用類型,表示對具有特定參數(shù)列表和返回類型的方法的引用。
Action與Function區(qū)別
- 相同:內(nèi)置委托類型,顧名思義Action和Func本身就是已經(jīng)定義好的委托類型。
- 區(qū)別:Action委托簽名不提供返回類型,而Func提供返回類型。
Redis場景?數(shù)據(jù)類型?為什么速度、分布式鎖? 大規(guī)模秒殺
如何保證緩存與數(shù)據(jù)庫雙寫時的數(shù)據(jù)一致性?CAP
緩存雪崩和緩存穿透問題解決?
數(shù)據(jù)庫的鎖類型?共享 排他 更新鎖
數(shù)據(jù)庫系統(tǒng)角度
- 排他鎖
- 共享鎖(Share Lock)
- 多個事務可封鎖同一個共享頁
- 任何事務都不能修改該頁
- 通常是該頁被讀取完畢,讀鎖立即被釋放
- sqlserver使用 with(HOLDLOCK)
- 更新鎖
程序員角度
- 悲觀鎖
- 樂觀鎖
悲觀鎖和樂觀鎖的區(qū)別?如何實現(xiàn)樂觀鎖悲觀鎖?
索引 mysql索引的方式
事務隔離級別 默認分布式事務
EF里如何避免臟讀
臟讀定義
- 當一個事務正在訪問數(shù)據(jù),并且對數(shù)據(jù)進行了修改,而這種修改還沒有提交到數(shù)據(jù)庫中,這時,另外一個事務也訪問這個數(shù)據(jù),然后使用了這個數(shù)據(jù)。因為這個數(shù)據(jù)是還沒有提交的數(shù)據(jù),那么另外一個事務讀到的這個數(shù)據(jù)是臟數(shù)據(jù),依據(jù)臟數(shù)據(jù)所做的操作可能是不正確的
如果避免臟讀
- 設置事務隔離級別TRANSACTION_READ_COMMITTED,常用防止臟讀
設計模式 k8s docker 隊列 linux
裝箱的底層原理;裝箱、拆箱過程中的性能損失,如何避免裝箱彼此相過程中的性能損失;
裝箱的底層原理
- 所有的值類型都繼承自System.ValueType,而System.ValueType繼承自System.Object。
- 所有的值類型對象都分配在堆棧上,而所有的引用類型包括System.Object對象都分配在堆上。
- CLR需要做額外的工作把堆棧上的值類型移動到堆上,這個操作就被稱為裝箱。
- 在堆上分配一個內(nèi)存空間,大小等于需要裝箱的值類型對象的大小加上兩個引用類型對象都擁有的成員:類型對象指針和同步塊引用。
- 把堆棧上的值類型對象復制到堆上新分配的對象。
- 返回一個指向堆上新對象的引用,并且存儲到堆棧上被裝箱的那個值類型的對象里。
如何避免裝箱彼此相過程中的性能損失
- 盡量減少裝箱拆箱操作
- 通過泛型解決
- 在循環(huán)里外,提前進行裝箱
多線程鎖的類型
- 原子操作(Interlocked)
所有方法都是執(zhí)行一次原子讀取或一次寫入操作。 - lock()
避免鎖定public類型,否則實例將超出代碼控制的范圍,定義private對象來鎖定。 - Monitor實現(xiàn)線程同步
通過Monitor.Enter() 和 Monitor.Exit()實現(xiàn)排它鎖的獲取和釋放,獲取之后獨占資源,不允許其他線程訪問。還有一個TryEnter方法,請求不到資源時不會阻塞等待,可以設置超時時間,獲取不到直接返回false。 - ReaderWriterLock
當對資源操作讀多寫少的時候,為了提高資源的利用率,讓讀操作鎖為共享鎖,多個線程可以并發(fā)讀取資源,而寫操作為獨占鎖,只允許一個線程操作。 - 事件(Event)類實現(xiàn)同步
事件類有兩種狀態(tài),終止狀態(tài)和非終止狀態(tài),終止狀態(tài)時調(diào)用WaitOne可以請求成功,通過Set將時間狀態(tài)設置為終止狀態(tài)。- AutoResetEvent(自動重置事件)
- ManualResetEvent(手動重置事件)
- 信號量(Semaphore)
信號量是由內(nèi)核對象維護的int變量,為0時,線程阻塞,大于0時解除阻塞,當一個信號量上的等待線程解除阻塞后,信號量計數(shù)+1。線程通過WaitOne將信號量減1,通過Release將信號量加1,使用很簡單。 - 互斥體(Mutex)
獨占資源,用法與Semaphore相似。 - 跨進程間的同步
通過設置同步對象的名稱就可以實現(xiàn)系統(tǒng)級的同步,不同應用程序通過同步對象的名稱識別不同同步對象。