先看看為什麼要用鎖 需求:多線程處理值的加減 static int NoLockData = 0; public static void NoLockNormalTest(int threadIndex) { while (true)//這是腦殘設計,while(true) { //lock (lo ...
先看看為什麼要用鎖 需求:多線程處理值的加減
static int NoLockData = 0; public static void NoLockNormalTest(int threadIndex) { while (true)//這是腦殘設計,while(true) { //lock (lockNormal) { NoLockData++; Debug.Print("{0}無鎖狀態的+值{1}", threadIndex, NoLockData); NoLockData--; Debug.Print("{0}無鎖狀態的-值{1}", threadIndex, NoLockData); } Thread.Sleep(1);//讓我們養成良好習慣,每一個while都要休息下 } }
new Thread(() =>{ NoLockNormalTest(1); }){ IsBackground=true}.Start(); new Thread(() =>{ NoLockNormalTest(2); }){ IsBackground=true}.Start(); new Thread(() =>{ NoLockNormalTest(3); }){ IsBackground=true}.Start(); new Thread(() =>{ NoLockNormalTest(4); }) { IsBackground=true}.Start();
這個時候值是亂的
引入第一種鎖lock
/// <summary> /// 聲明一個應用object變數,不能值變數,別問,問就是object變數,養成習慣,static 是因為我在控制台 /// </summary> private static object lockNormal = new object();
public static void LockNormalTest(int threadIndex)
{
while (true)//這是腦殘設計,while(true)
{
lock (lockNormal)
{
NoLockData++;
Debug.Print("{0}無鎖狀態的+值{1}", threadIndex, NoLockData);
NoLockData--;
Debug.Print("{0}無鎖狀態的-值{1}", threadIndex, NoLockData);
}
Thread.Sleep(1);//讓我們養成良好習慣,每一個while都要休息下
}
}
這個時候值是穩定的大家都在無序被鎖控制
很簡單把,使用註意點,要鎖的話必須同一個變數
public static object lockData=new object(); lock(lockData){
//這裡面處理事情 }