競態條件和死鎖。
若是兩個或多個線程訪問相同的對象,或者訪問不一樣步的共享狀態 ,就會出現競態條件;
爲了不出現該問題,能夠鎖定共享的對象。可是過多的鎖定也會有麻煩,那就是死鎖;
當至少有兩個線程被掛起,等待對方解除鎖定。因爲兩個線程都在等待對方,就出現了死鎖,線程將無限等下去;
要避免同步問題,最好不要在線程之間共享數據。固然,這並不老是可行的。若是須要共享數據,就必須使用同步技術;
確保一次只有一個線程訪問和改變共享狀態。注意,同步問題與競態條件和死鎖有關。若是不注意這些問題,就很難在應用程序中找到問題的緣由,由於線程問題是不按期發生的。
------
多線程同時訪問一個實例對象時, 能夠給進程加一把鎖來處理。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; } } } }