C# 多線程中常常訪問同一資源可能形成什麼問題?

競態條件和死鎖。

若是兩個或多個線程訪問相同的對象,或者訪問不一樣步的共享狀態 ,就會出現競態條件;

爲了不出現該問題,能夠鎖定共享的對象。可是過多的鎖定也會有麻煩,那就是死鎖;

當至少有兩個線程被掛起,等待對方解除鎖定。因爲兩個線程都在等待對方,就出現了死鎖,線程將無限等下去;

要避免同步問題,最好不要在線程之間共享數據。固然,這並不老是可行的。若是須要共享數據,就必須使用同步技術;

確保一次只有一個線程訪問和改變共享狀態。注意,同步問題與競態條件和死鎖有關。若是不注意這些問題,就很難在應用程序中找到問題的緣由,由於線程問題是不按期發生的。

------


多線程同時訪問一個實例對象時, 能夠給進程加一把鎖來處理。lock是確保當一個線程位於代碼的臨界區時,另外一個線程不進入臨界區。若是其餘線程試圖進入鎖定的代碼,則它將一直等待(即被阻止),直到該對象被釋放。
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;
        }
    }
}

 

雙重鎖定:不用讓線程每次都加鎖,而只是在實例未被建立的時候再加鎖處理,提升了性能。多線程

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;
            }
        }
    }
}
相關文章
相關標籤/搜索