亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C# > 正文

C#中lock死鎖實例教程

2020-01-24 02:29:26
字體:
來源:轉載
供稿:網友

在c#中有個關鍵字lock,它的作用是鎖定某一代碼塊,讓同一時間只有一個線程訪問該代碼塊,本文就來談談lock關鍵字的原理和其中應注意的幾個問題:

lock的使用原型是:

lock(X){  //需要鎖定的代碼.... }

首先要明白為什么上面這段話能夠鎖定代碼,其中的奧妙就是X這個對象,事實上X是任意一種引用類型,它在這兒起的作用就是任何線程執行到lock(X)時候,X需要獨享才能運行下面的代碼,若假定現在有3個線程A,B,C都執行到了lock(X)而ABC因為此時都占有X,這時ABC就要停下來排個隊,一個一個使用X,從而起到在下面的代碼塊內只有一個線程在運行(因為此時只有一個線程獨享X,其余兩個在排隊),所以這個X必須是所有要執行臨界區域代碼進程必須共有的一個資源,從而起到抑制線程的作用。

下面再來談談lock使用中會遇到和注意的問題,lock最需要注意的一個問題就是線程死鎖!

在MSDN上列出了3個典型問題:

通常,應避免鎖定 public 類型,否則實例將超出代碼的控制范圍。常見的結構 lock (this)、lock (typeof (MyType)) 和 lock ("myLock") 違反此準則:

如果實例可以被公共訪問,將出現 lock (this) 問題。

如果 MyType 可以被公共訪問,將出現 lock (typeof (MyType)) 問題。

由于進程中使用同一字符串的任何其他代碼將共享同一個鎖,所以出現 lock(“myLock”) 問題。

最佳做法是定義 private 對象來鎖定, 或 private shared 對象變量來保護所有實例所共有的數據。

(1)lock (this) 問題:

假定有兩個類:

class A{} class B{} 

有兩個公共對象:

A a=new A(); B b=new B(); 

首先在A中若有一函數內的代碼需要鎖定:

代碼1:

lock(this)//this在這里就是a {  //....  lock(b)  { //......  } } 

然而此時B中某函數也有如下代碼需要鎖定:

代碼2:

lock(this)//this在這里就是b {  //....  lock(a)  { //......  } } 

設想一下上面兩段代碼在兩個線程下同時執行會有什么后果?

結果就是,代碼1執行到lock(this)后a被鎖定,代碼2執行到lock(this)后b被鎖定,然后代碼1需求b,代碼2需求a,此時兩個需求都被相互占有出現僵持狀態,程序死鎖了。

(2)lock(typeof (MyType))問題:

假定有兩個公共變量:

int a;float b; 

下面看如下代碼

代碼3:

lock(typeof(a))//typeof(a)就是System.type.Int類型 {  //....  lock(typeof(b))  { //......  } } 

又有如下代碼:

代碼4:

lock(typeof(b))//typeof(b)就是System.type.Float類型 {  //....  lock(typeof(a))  { //......  } } 

若有兩個進程分別同時進入上面兩個代碼外層的lock,就分別鎖定了System.type.Int和System.type.Float,而馬上它們又需求System.type.Float和System.type.Int,彼此相互占有,彼此僵持,程序進入死鎖狀態!

(3)字符串問題 :

在闡述這個問題之前,有一個知識大家必須知道:C#中字符串被公共語言運行庫 (CLR)“暫留”。這意味著整個程序中任何給定字符串都只有一個實例,就是這同一個對象表示了所有運行的應用程序域的所有線程中的該文本。因此,只要在應用程序進程中的任何位置處具有相同內容的字符串上放置了鎖,就將鎖定應用程序中該字符串的所有實例。

言下之意就是假定有兩個類分別有兩個字符串:

class A {  string a="abc";  string b="def"; } class c {  string c="abc";  string d="def"; } 

事實上a和c引用的是同一個字符串"abc",b和d引用的是同一個字符串"def"

現在如果在兩個類中有如下代碼

在類A中有代碼5:

lock(b)//b是"def" {  //....  lock(a)//a是"abc"  { //......  } } 

在類B中有代碼6:

lock(c)//c是"abc" {  //....  lock(d)//d是"def"  { //......  } } 

那么代碼5和代碼6同時有兩個線程執行結果可想而知:在兩個線程執行到外層lock代碼時"def"和"abc"被鎖定。接著他們在內部lock處同時需求"abc"和"def",而此時兩個字符串被兩個進程彼此占有,程序又死鎖了!所以MSDN說:鎖定字符串尤其危險!最好不要使用!

MSDN最后說了:最佳做法是定義 private 對象來鎖定, 或 private shared 對象變量來保護所有實例所共有的數據。
在個人看來,也不是絕對安全,這里就舉出一個例子:

假定有一個類:

class A {  private Object a=new Object();  private Object b=new Object();  public void x()  {   lock(a)   {     //.....     lock(b)     {      //....     }   }  }  public void y()  {   lock(b)   {     //.....     lock(a)     {      //....     }   }  } } 

現在假定有兩個線程同時執行函數x()和y();結果private對象a和b分別在外層lock鎖定,接著兩個線程在內部又立馬需求b和a,a,b彼此占有又彼此需求,程序死鎖。

所以具體要看情況而定,但是定義 private 對象來鎖定至少可以降低風險。

希望本文所述C#中lock的應用對大家的C#程序設計有所幫助。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
中文字幕视频一区二区在线有码| 欧美成人精品一区| 永久免费毛片在线播放不卡| 国产精品久在线观看| 亚洲国产欧美一区二区三区久久| 国产午夜精品视频免费不卡69堂| 精品久久久久久久久久久| 91视频88av| 国产精品久久一区主播| 国产丝袜一区二区三区| 中文字幕日韩电影| 亚洲一区二区三区sesese| 国产精品xxx视频| 狠狠色狠狠色综合日日五| 欧美日韩成人网| 永久免费毛片在线播放不卡| 久久天天躁狠狠躁夜夜躁2014| 日本一区二三区好的精华液| 欧美成人全部免费| 亚洲精品99久久久久中文字幕| 欧美激情按摩在线| 欧美在线观看一区二区三区| 欧美成人免费网| 亚洲福利视频免费观看| 91免费精品国偷自产在线| 国产精品高潮粉嫩av| 国产不卡在线观看| 91免费精品视频| 欧美午夜激情在线| 91日本视频在线| 色与欲影视天天看综合网| 亚洲精品白浆高清久久久久久| 国产极品jizzhd欧美| 久久艳片www.17c.com| 神马久久桃色视频| 成人免费观看49www在线观看| 亚洲在线观看视频| 日本韩国欧美精品大片卡二| 亚洲一区二区在线播放| xvideos亚洲人网站| 欧美午夜性色大片在线观看| 成人午夜小视频| 色777狠狠综合秋免鲁丝| 在线播放国产一区中文字幕剧情欧美| 国产性色av一区二区| 九九热这里只有在线精品视| 国产精品久久久久免费a∨| 欧美极品少妇xxxxx| 97在线视频免费看| 国产精品美乳一区二区免费| 国产精品2018| 亚洲国产成人一区| 国产精品中文字幕久久久| 中文国产成人精品久久一| 97精品伊人久久久大香线蕉| 国产在线观看91精品一区| 亚洲天堂一区二区三区| 奇米影视亚洲狠狠色| 欧美激情喷水视频| 亚洲国内精品视频| 日韩中文字幕国产精品| 日韩精品一区二区三区第95| 亚洲一区久久久| 亚洲淫片在线视频| 国产噜噜噜噜久久久久久久久| 国产精品视频免费在线| 久久久国产91| 国产亚洲aⅴaaaaaa毛片| 青草成人免费视频| 国产精品亚洲激情| 亚洲图片欧美午夜| 97视频免费在线观看| 亚洲成人精品久久| 欧美激情奇米色| 成人久久一区二区三区| 日韩中文字幕在线免费观看| 亚洲男人天堂九九视频| 国产精品久久久久久av| 高清视频欧美一级| 久久久久久久久中文字幕| 亚洲欧美在线一区二区| 亚洲嫩模很污视频| 视频一区视频二区国产精品| 精品福利免费观看| 欧美在线影院在线视频| 亚洲一区二区三区在线免费观看| 成人亲热视频网站| 在线精品高清中文字幕| 国产一区二区三区高清在线观看| 亚洲精品日韩丝袜精品| 91精品在线国产| 亚洲国产精品成人va在线观看| 激情成人中文字幕| 国产手机视频精品| 精品露脸国产偷人在视频| 欧美性视频网站| 色小说视频一区| 欧美性色19p| 精品亚洲夜色av98在线观看| 亚洲xxxx3d| 91精品视频免费观看| 亚洲色图在线观看| 亚洲中国色老太| 欧美一级片一区| 欧美韩国理论所午夜片917电影| 国产精品久久久久久久9999| 国产精品吹潮在线观看| 欧美大片欧美激情性色a∨久久| 主播福利视频一区| 欧美大片va欧美在线播放| 亚洲精品之草原avav久久| 欧美成人性色生活仑片| 日韩av在线免费看| 亚洲欧美一区二区三区情侣bbw| 日产日韩在线亚洲欧美| 日韩精品免费在线| 久久免费少妇高潮久久精品99| 国产日韩综合一区二区性色av| 性夜试看影院91社区| 国产欧美va欧美va香蕉在线| 久久综合88中文色鬼| 韩国v欧美v日本v亚洲| 国产一区二区久久精品| 亚洲日韩中文字幕在线播放| 精品国产31久久久久久| 久久久久久久999| 国产精品三级久久久久久电影| 欧美激情一区二区三区久久久| 国产成人精品电影久久久| 亚洲一区二区三| 国产午夜精品全部视频播放| 亚洲天堂网站在线观看视频| 欧美激情a∨在线视频播放| 亚洲精品久久久一区二区三区| 日韩在线视频网| 亚洲最大福利视频网| 欧美激情在线狂野欧美精品| 中文字幕欧美日韩精品| 欧美激情久久久久| 国产视频一区在线| 57pao成人国产永久免费| 亚洲大胆美女视频| 国产综合久久久久| 日韩成人av网| 日本成人免费在线| 欧美做爰性生交视频| 精品动漫一区二区| 91精品在线一区| 欧美另类在线播放| 亚洲毛片一区二区| 亚洲成人激情视频| 97在线看福利| 国产91精品青草社区| 456国产精品| 国产精品视频yy9099| 国产日韩在线亚洲字幕中文| 久久久噜噜噜久久久| 国产欧美在线观看| 亚洲精品美女久久久久| 伊人久久综合97精品| 亚洲国产精品人人爽夜夜爽| 国产一区二区三区在线视频| 中文字幕久热精品在线视频| 国产精品视频网|