最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C#中l(wèi)ock死鎖實(shí)例教程

 更新時間:2014年08月25日 15:46:00   投稿:shichen2014  
這篇文章主要介紹了C#中l(wèi)ock死鎖的用法,對于共享資源的訪問及C#程序設(shè)計(jì)的安全性而言,有著非常重要的意義!需要的朋友可以參考下

在c#中有個關(guān)鍵字lock,它的作用是鎖定某一代碼塊,讓同一時間只有一個線程訪問該代碼塊,本文就來談?wù)刲ock關(guān)鍵字的原理和其中應(yīng)注意的幾個問題:

lock的使用原型是:

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

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

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

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

通常,應(yīng)避免鎖定 public 類型,否則實(shí)例將超出代碼的控制范圍。常見的結(jié)構(gòu) lock (this)、lock (typeof (MyType)) 和 lock ("myLock") 違反此準(zhǔn)則:

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

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

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

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

(1)lock (this) 問題:

假定有兩個類:

class A{} 
class B{} 

有兩個公共對象:

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

首先在A中若有一函數(shù)內(nèi)的代碼需要鎖定:

代碼1:

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

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

代碼2:

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

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

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

(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)) 
 { 
//...... 
 } 
} 

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

(3)字符串問題 :

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

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

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

class c 
{ 
 string c="abc"; 
 string d="def"; 
} 

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

現(xiàn)在如果在兩個類中有如下代碼

在類A中有代碼5:

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

在類B中有代碼6:

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

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

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

假定有一個類:

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) 
    { 
     //.... 
    } 
  } 
 } 
} 

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

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

希望本文所述C#中l(wèi)ock的應(yīng)用對大家的C#程序設(shè)計(jì)有所幫助。

相關(guān)文章

  • Winform窗體縮放下使用剪切板功能出現(xiàn)頁面閃動解決分析

    Winform窗體縮放下使用剪切板功能出現(xiàn)頁面閃動解決分析

    這篇文章主要介紹了Winform窗體縮放下使用剪切板功能出現(xiàn)頁面閃動解決分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-11-11
  • C#圖像處理之圖像目標(biāo)質(zhì)心檢測的方法

    C#圖像處理之圖像目標(biāo)質(zhì)心檢測的方法

    這篇文章主要介紹了C#圖像處理之圖像目標(biāo)質(zhì)心檢測的方法,可實(shí)現(xiàn)C#計(jì)算圖像質(zhì)心的相關(guān)技巧,需要的朋友可以參考下
    2015-04-04
  • C#網(wǎng)絡(luò)請求與JSON解析的示例代碼

    C#網(wǎng)絡(luò)請求與JSON解析的示例代碼

    這篇文章主要介紹了C#網(wǎng)絡(luò)請求與JSON解析的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03
  • C#中的out關(guān)鍵字用法詳解

    C#中的out關(guān)鍵字用法詳解

    在 C# 中,out 關(guān)鍵字是一個修飾符,它允許你在方法內(nèi)部創(chuàng)建一個臨時的變量,用于接收傳遞進(jìn)來的參數(shù)值,并在方法執(zhí)行完畢后,將該變量的值返回給調(diào)用方法的對象,本文將給大家詳細(xì)介紹一下C#中的out關(guān)鍵字用法,需要的朋友可以參考下
    2024-02-02
  • c#編寫的番茄鐘倒計(jì)時器代碼

    c#編寫的番茄鐘倒計(jì)時器代碼

    番茄鐘是老外做飯用的一個廚具,比如蒸包子,水開后再蒸十分鐘,就把番茄鐘擰一下擰到10的刻度上,然后番茄鐘就嗒嗒嗒的慢慢歸位,等到十分鐘后完全歸位,然后就叮的響一聲,提醒老外把火關(guān)掉。
    2015-03-03
  • c# 接口使用實(shí)例

    c# 接口使用實(shí)例

    這篇文章主要介紹了c#接口使用的實(shí)例,文中講解非常細(xì)致,代碼幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下
    2020-07-07
  • c#中文轉(zhuǎn)unicode字符示例分享

    c#中文轉(zhuǎn)unicode字符示例分享

    本文介紹了中文轉(zhuǎn)unicode字符的方法,還有UNICODE字符轉(zhuǎn)為中文的方法,大家參考使用吧
    2014-01-01
  • C#中Class的實(shí)例化過程詳解

    C#中Class的實(shí)例化過程詳解

    文章詳細(xì)闡述了C#中類的成員,包括靜態(tài)字段、靜態(tài)構(gòu)造函數(shù)、實(shí)例字段等的初始化順序,在無繼承情況下,實(shí)例化分為聲明時初始化和構(gòu)造函數(shù)中初始化兩種,分別有明確的執(zhí)行順序,需要的朋友可以參考下
    2024-09-09
  • vista和win7在windows服務(wù)中交互桌面權(quán)限問題解決方法:穿透Session 0 隔離

    vista和win7在windows服務(wù)中交互桌面權(quán)限問題解決方法:穿透Session 0 隔離

    服務(wù)(Service)對于大家來說一定不會陌生,它是Windows 操作系統(tǒng)重要的組成部分。我們可以把服務(wù)想像成一種特殊的應(yīng)用程序,它隨系統(tǒng)的“開啟~關(guān)閉”而“開始~停止”其工作內(nèi)容,在這期間無需任何用戶參與
    2016-04-04
  • C#中常見警告類型及處理方法詳解

    C#中常見警告類型及處理方法詳解

    在C#開發(fā)過程中,常常會遇到各種各樣的警告信息,本文將結(jié)合多種常見情況,詳細(xì)介紹如何處理C#中的一些典型警告,希望對大家有所幫助
    2024-11-11

最新評論

紫阳县| 龙陵县| 枝江市| 阿克苏市| 磴口县| 定陶县| 甘德县| 饶河县| 高安市| 监利县| 高安市| 利辛县| 梨树县| 重庆市| 重庆市| 遂平县| 抚远县| 河北区| 东乡族自治县| 巴楚县| 青铜峡市| 贡山| 吉木乃县| 贡山| 庄河市| 旺苍县| 武邑县| 曲靖市| 松溪县| 揭东县| 云林县| 夏河县| 赞皇县| 阿城市| 松江区| 新安县| 高雄县| 凤翔县| 富蕴县| 普格县| 仁寿县|