1.說說常用的鎖,lock是一種什么樣的鎖?
常用的如如SemaphoreSlim、ManualResetEventSlim、Monitor、自旋鎖SpinLock、讀寫鎖ReadWriteLockSlim,lock是一個混合鎖,其實質是Monitor
2.lock為什么要鎖定一個參數(可否為值類型?)參數有什么要求?
lock的鎖對象要求為一個引用類型。她可以鎖定值類型,但值類型會被裝箱,每次裝箱后的對象都不一樣,會導致鎖定無效。
對於lock鎖,鎖定的這個對象參數才是關鍵,這個參數的同步索引塊指針會指向一個真正的鎖(同步塊),這個鎖(同步塊)會被復用。
3.多線程和異步的區別和聯系?
多線程是實現異步的主要方式之一,異步並不等同於多線程。實現異步的方式還有很多,比如利用硬件的特性、使用進程或線程等。
在.NET中就有很多的異步編程支持,比如很多地方都有Begin、End 的方法,就是一種異步編程支持,她內部有些是利用多線程,有些是利用硬件的特性來實現的異步編程。
4.線程池的優點有哪些?又有哪些不足
優點:減小線程創建和銷毀的開銷,可以復用線程;也從而減少了線程上下文切換的性能損失;在GC回收時,較少的線程更有利於GC的回收效率。
缺點:線程池無法對一個線程有更多的精確的控制,如了解其運行狀態等;不能設置線程的優先級;加入到線程池的任務(方法)不能有返回值;對於需要長期運行的任務就不適合線程池。
5.Mutex和lock有什么不同?一般用哪一種比較好?
Mutex是一個基於內核模式的互斥鎖,支持鎖的遞歸調用,而Lock是一個混合鎖,一般建議使用Lock更好,因為lock的性能更好。
6.Thread 類有哪些常用的屬性和方法?
屬性:
CurrentContext:獲取線程正在其中執行的當前上下文。
CurrentCulture:獲取或設置當前線程的區域性。
CurrentPrincipal:獲取或設置線程的當前負責人(對基於角色的安全性而言)。
CurrentThread:獲取當前正在運行的線程。
CurrentUICulture:獲取或設置資源管理器使用的當前區域性以便在運行時查找區域性特定的資源。
IsBackground:獲取或設置一個值,該值指示某個線程是否為后台線程。
Priority:獲取或設置一個值,該值指示線程的調度優先級。
ThreadState:獲取一個值,該值包含當前線程的狀態。
方法:
public void Abort()
在調用此方法的線程上引發 ThreadAbortException,以開始終止此線程的過程。調用此方法通常會終止線程。
public static void ResetAbort()
取消為當前線程請求的 Abort。
public void Start()
開始一個線程。
public static void Sleep( int millisecondsTimeout )
讓線程暫停一段時間。
public static bool Yield()
導致調用線程執行准備好在當前處理器上運行的另一個線程。由操作系統選擇要執行的線程。
7、聊聊任務Task與並行Parallel
任務Task與並行Parallel本質上內部都是使用的線程池,提供了更豐富的並行編程的方式。任務Task基於線程池,可支持返回值,支持比較強大的任務執行計划定制等功能,下面是一個簡單的示例。Task提供了很多方法和屬性,通過這些方法和屬性能夠對Task的執行進行控制,並且能夠獲得其狀態信息。Task的創建和執行都是獨立的,因此可以對關聯操作的執行擁有完全的控制權。
//創建一個任務
Task<int> t1 = new Task<int>(n =>
{
System.Threading.Thread.Sleep(1000);
return (int)n;
}, 1000);
//定制一個延續任務計划
t1.ContinueWith(task =>
{
Console.WriteLine("end" + t1.Result);
}, TaskContinuationOptions.AttachedToParent);
t1.Start();
//使用Task.Factory創建並啟動一個任務
var t2 = System.Threading.Tasks.Task.Factory.StartNew(() =>
{
Console.WriteLine("t1:" + t1.Status);
});
Task.WaitAll();
Console.WriteLine(t1.Result);
並行Parallel內部其實使用的是Task對象(TPL會在內部創建System.Threading.Tasks.Task的實例),所有並行任務完成后才會返回。少量短時間任務建議就不要使用並行Parallel了,並行Parallel本身也是有性能開銷的,而且還要進行並行任務調度、創建調用方法的委托等等。
8、下面代碼輸出結果是什么?為什么?
int a = 0;
System.Threading.Tasks.Parallel.For(0, 100000, (i) =>
{
a++;
});
Console.Write(a);
輸出結果不穩定,小於等於100000。因為多線程訪問,沒有使用鎖機制,會導致有更新丟失。
9、多線程並行(Parallelism)和並發(Concurrency)的區別
-
並行:同一時刻有多條指令在多個處理器上同時執行,無論從宏觀還是微觀上都是同時發生的。
-
並發:是指在同一時間段內,宏觀上看多個指令看起來是同時執行,微觀上看是多個指令進程在快速的切換執行,同一時刻可能只有一條指令被執行。
10、C# Parallel.For和普通For的區別
Parallel類是.NET 4中新增的抽象線程類。Parallel.For()方法類似於C#的for循環語句,也是多次執行一個任務。但是使用Parallel.For()方法,可以並行運行。
對於Parallel.For、Parallel.Foreach的使用應該要特別小心,它們的優勢是處理列表很長,且對列表內的元素進行很復雜的業務邏輯,且不會使用共享資源,只針對自身的業務邏輯處理,方才能提升效率。