C#使用LOCK實現(xiàn)線程同步_第1頁
C#使用LOCK實現(xiàn)線程同步_第2頁
C#使用LOCK實現(xiàn)線程同步_第3頁
C#使用LOCK實現(xiàn)線程同步_第4頁
C#使用LOCK實現(xiàn)線程同步_第5頁
已閱讀5頁,還剩1頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領

文檔簡介

第C#使用LOCK實現(xiàn)線程同步線程安全概念:線程安全是指在當一個線程訪問該類的某個數(shù)據(jù)時,進行保護,其他線程不能進行訪問直到該線程讀取完,其他線程才可使用。不會出現(xiàn)數(shù)據(jù)不一致或者數(shù)據(jù)污染。

線程有可能和其他線程共享一些資源,比如,內(nèi)存,文件,數(shù)據(jù)庫等。當多個線程同時讀寫同一份共享資源的時候,可能會引起沖突。這時候,我們需要引入線程同步機制,即各位線程之間要有個先來后到,不能一窩蜂擠上去搶作一團。線程同步的真實意思和字面意思恰好相反。線程同步的真實意思,其實是排隊:幾個線程之間要排隊,一個一個對共享資源進行操作,而不是同時進行操作。

下面將通過簡單的四個案例進行對比,來講解LOCK的實現(xiàn)線程同步使用。

首先創(chuàng)建兩個線程,兩個線程執(zhí)行同一個方法,代碼如下:

classProgram

staticvoidMain(string[]args)

ThreadthreadA=newThread(ThreadMethod);//執(zhí)行的必須是無返回值的方法

threadA.Name="threadA";

ThreadthreadB=newThread(ThreadMethod);//執(zhí)行的必須是無返回值的方法

threadB.Name="threadB";

threadA.Start();

threadB.Start();

Console.ReadKey();

publicstaticvoidThreadMethod(objectparameter)

for(inti=1;i=10;i++)

Console.WriteLine("我是:{0},我循環(huán){1}次",Thread.CurrentThread.Name,i);

Thread.Sleep(1000);//休眠一秒

}

通過下面的執(zhí)行結(jié)果,可以很清楚的看到,兩個線程是在同時執(zhí)行ThreadMethod這個方法,這顯然不符合我們線程同步的要求。

執(zhí)行結(jié)果:

通過對上面代碼的修改如下:

classProgram

staticvoidMain(string[]args)

Programpro=newProgram();

ThreadthreadA=newThread(pro.ThreadMethod);

threadA.Name="threadA";

ThreadthreadB=newThread(pro.ThreadMethod);

threadB.Name="threadB";

threadA.Start();

threadB.Start();

Console.ReadKey();

publicvoidThreadMethod(objectparameter)

lock(this)//添加lock關鍵字

for(inti=1;i=10;i++)

Console.WriteLine("我是:{0},我循環(huán){1}次",Thread.CurrentThread.Name,i);

Thread.Sleep(1000);//休眠一秒

}

執(zhí)行結(jié)果:

我們通過添加了lock(this){...}代碼,查看執(zhí)行結(jié)果實現(xiàn)了我們想要的線程同步需求。

但是我們知道this表示當前類實例的本身,那么有這么一種情況,我們把需要訪問的方法所在的類型進行兩個實例A和B,線程A訪問實例A的方法ThreadMethod,線程B訪問實例B的方法ThreadMethod,這樣的話還能夠達到線程同步的需求嗎?

修改后的代碼如下:

classProgram

staticvoidMain(string[]args)

Programpro1=newProgram();

Programpro2=newProgram();

ThreadthreadA=newThread(pro1.ThreadMethod);

threadA.Name="threadA";

ThreadthreadB=newThread(pro2.ThreadMethod);

threadB.Name="threadB";

threadA.Start();

threadB.Start();

Console.ReadKey();

publicvoidThreadMethod(objectparameter)

lock(this)//添加lock關鍵字

for(inti=1;i=10;i++)

Console.WriteLine("我是:{0},我循環(huán){1}次",Thread.CurrentThread.Name,i);

Thread.Sleep(1000);//休眠一秒

}

執(zhí)行結(jié)果:

我們會發(fā)現(xiàn),線程又沒有實現(xiàn)同步了!lock(this)對于這種情況是不行的!

通過對上面代碼再次進行如下修改:

classProgram

privatestaticobjectobj=newobject();

staticvoidMain(string[]args)

Programpro1=newProgram();

Programpro2=newProgram();

ThreadthreadA=newThread(pro1.ThreadMethod);

threadA.Name="threadA";

ThreadthreadB=newThread(pro2.ThreadMethod);

threadB.Name="threadB";

threadA.Start();

threadB.Start();

Console.ReadKey();

publicvoidThreadMethod(objectparameter)

lock(obj)//添加lock關鍵字

for(inti=1;i=10;i++)

Console.WriteLine("我是:{0},我循環(huán){1}次",Thread.CurrentThread.Name,i);

Thread.Sleep(1000);//休眠一秒

}

執(zhí)行結(jié)果:

通過查看執(zhí)行結(jié)果。會發(fā)現(xiàn)代碼實現(xiàn)了我們的需求。

那么lock(this)和lock(Obj)有什么區(qū)別呢?

lock(this)鎖定當前實例對象,如果有多個類實例的話,lock鎖定的只是當前類實例,對其它類實例無影響。所有不推薦使用。

lock(typeof(Model))鎖定的是model類的所有實例。

lock(obj)鎖定的對象是全局的私有化靜態(tài)變量。外部無法對該變量進行訪問。

lock確保當一個線程位于代碼的臨界區(qū)時,另一個線程不進入臨界區(qū)。如果其他線程試圖進入鎖定的代碼,則它將一直等待(即被阻止),直到該對象被釋放。

所以,lock的結(jié)果好不好,還是關鍵看鎖的誰,如果外邊能對這個誰進行修改,lock就失去了作用。所以一般情況下,使用私有的、靜態(tài)的并且是只讀的對象

1.lock的是必須是引用類型的對象,string類型除外。2.lock推薦的做法是使用靜態(tài)的、只讀的、私有的對象。3.保證lock的對象在外部無法修改才有意義,如果lock的對象在外部改變了,對其他線程就會暢通無阻,失去了lock的意義。

不能鎖定字符串,鎖定字符串尤其危險,因為字符串被公共語言運行庫(CLR)暫留。這意味著整個程序中任何給定字符串都只有一個實例,就是這同一個對象表示了所有運行的應用程序域的所有線程中的該文本。因此,只要在應用程序進程中的任何位置處具有相同內(nèi)容的字符串上放置了鎖,就將鎖定應用程序中該字符串的所有實例。通常,最好避免鎖定public類型或鎖定不受應用程序控制的對象實例。例如,如果該實例可以被公開訪問,則lock(this)可能會有問題,因為不受控制的代碼也可能會鎖定該

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論