欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C# 多線程中經(jīng)常訪問同一資源可能造成哪些問題

 更新時(shí)間:2022年04月20日 10:02:09   作者:代碼描繪人生  
這篇文章主要介紹了C# 多線程中經(jīng)常訪問同一資源可能造成哪些問題,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

多線程經(jīng)常訪問同一資源可能造成什么問題

競態(tài)條件和死鎖

如果兩個(gè)或多個(gè)線程訪問相同的對象,或者訪問不同步的共享狀態(tài) ,就會(huì)出現(xiàn)競態(tài)條件;

為了避免出現(xiàn)該問題,可以鎖定共享的對象。但是過多的鎖定也會(huì)有麻煩,那就是死鎖;

當(dāng)至少有兩個(gè)線程被掛起,等待對方解除鎖定。由于兩個(gè)線程都在等待對方,就出現(xiàn)了死鎖,線程將無限等下去;

要避免同步問題,最好不要在線程之間共享數(shù)據(jù)。當(dāng)然,這并不總是可行的。如果需要共享數(shù)據(jù),就必須使用同步技術(shù);

確保一次只有一個(gè)線程訪問和改變共享狀態(tài)。注意,同步問題與競態(tài)條件和死鎖有關(guān)。如果不注意這些問題,就很難在應(yīng)用程序中找到問題的原因,因?yàn)榫€程問題是不定期發(fā)生的。

多線程同時(shí)訪問一個(gè)實(shí)例對象時(shí), 可以給進(jìn)程加一把鎖來處理。

lock是確保當(dāng)一個(gè)線程位于代碼的臨界區(qū)時(shí),另一個(gè)線程不進(jìn)入臨界區(qū)。

如果其他線程試圖進(jìn)入鎖定的代碼,則它將一直等待(即被阻止),直到該對象被釋放。

public class Singleton
{
? ? private static Singleton instance;
? ? private static readonly object synRoot=new object();
? ? private Singleton() //改為私有
? ? {
? ? }
? ? public static Singleton GetInstance()
? ? {
? ? ? ? lock(synRoot)
? ? ? ? {
? ? ? ? ? ? if(instance==null)
? ? ? ? ? ? {
? ? ? ? ? ? ? ? instance=new Singleton();
? ? ? ? ? ? }
? ? ? ? ? ? return instance;
? ? ? ? }
? ? }
}

雙重鎖定:不用讓線程每次都加鎖,而只是在實(shí)例未被創(chuàng)建的時(shí)候再加鎖處理,提高了性能。

public class Singleton
{
? ? private static Singleton instance;
? ? private static readonly object synRoot=new object();
? ? private Singleton() //改為私有
? ? {
? ? }
? ? public static Singleton GetInstance()
? ? {
? ? ? ? if(instance==null)
? ? ? ? {
? ? ? ? ? ?lock(synRoot)
? ? ? ? ? ? {
? ? ? ? ? ? ? ? if(instance==null)
? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? instance=new Singleton();
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? return instance;
? ? ? ? ? ? }
? ? ? ? }
? ? }
}

多線程訪問資源沖突問題

多線程訪問同一資源時(shí),可以用同步機(jī)制解決問題

private Object _lock = new Object();//定義一個(gè)對象
private void method( paramtype,paramvalue) //線程訪問方法名
{
  lock (_lock)
  {
    //沖突代碼
  }
}

1. _lock 被lock了嗎?沒有則由當(dāng)前線程來lock,否則一直等待,直至_lock 被釋放。

2. lock以后在執(zhí)行l(wèi)ock{}中的代碼期間其他線程不能調(diào)用lock{}{中的代碼,也不能使用_lock。

3. 執(zhí)行完lock{}中的代碼之后釋放_(tái)lock,并且lock{}中的代碼可以被其他線程訪問。

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

最新評(píng)論