多執行緒下的單例模式

2021-09-01 10:32:57 字數 1383 閱讀 3290

在多執行緒下的singleton模式是有弊端的,但如何解決呢?辦法是使用lock機制。今天研究的lock機制,並且順便了解了些關於多執行緒的cpu層面的機制。

在單個cpu的環境下,在系統的某一時間下cpu只能做一件事情,乙個時間片(slice),這個是cpu執行最小單位。在系統中有多個程序看起來好像是同時執行,但實際上這些程序都是在乙個佇列中,排著隊。cpu在乙個時間片內先執行排到第一位的,當然,在處理排在第一位的程序的時候,很可能乙個時間片都過去了,但是這個程序還是沒有完,於是cpu管理就把它提到這個等待佇列的最後一位,再用乙個時間片來執行下乙個程序,而乙個時間片的時間是不定的,基本上為毫秒級的,所以在這個程序的等待佇列中,可能一秒鐘就輪循了一遍,即都有過執行,這樣就看起來好每個程序都在執行一樣。這存在乙個問題,就是為什麼pcu為什麼不一次就把乙個程序執行完呢?這樣就不需要很麻煩的管理佇列問題了。但windows的機制就是這樣的,保證公平,並且有個優先原則,比如你這個程序需要1秒就執行完,而排在你前一位的需要10秒才能執行完,於是cpu允許你插隊。

當然,還有個休眠佇列,當這個執行緒休眠的話,系統就把這個執行緒加入到休眠佇列,直到你的休眠時間到了,就把你提到等待佇列的最後乙個,等待cpu光臨你了。

lock機制(不知道是不是c#獨有的)是乙個鎖資源的傢伙。他能保證你他鎖住的東西在語句塊內沒有執行完,它是不會釋放資源,讓其他執行緒訪問的。

lock有幾種方式。lock(this) ,指鎖定整個物件,或者是lock(typeof(a)) (a為這個類的類名)當然可以實現,但是,鎖住整個物件,那其他執行緒要訪問這個物件,而並沒有涉及到lock語句內,那也沒辦法獲取lock了的資源(this),或者整個類的資源。最好的解決方案是專門建立乙個為鎖機制而造的object物件。

下面,寫的是個我自認為完美的解決singleton多執行緒問題的方案,是個範本,其中使用執行緒休眠,來放大多執行緒下的singleton錯誤。

using system;

using system.threading;

namespace singleton

static a a=null;

public static a geta(string s)

}return a;

}public override string tostring()

}class b

public void test2()

}class t}}

我讓這個執行緒睡覺是因為讓它把時間片交給其他執行緒,從而使得能夠有機會在singleton模式下實現多個物件的錯誤。

在這樣地餓情況下,如果你要是不lock,把lock語句註解了,就會實現在singleton模式下建立多個物件!

當然還有個小問題,那就是在使用lock的時候,能盡量不鎖的語句就放出去,別放在lock 語句內!道理是顯而易見的。

《轉》

多執行緒下的單例模式

單例模式分為兩種 懶漢單例模式和餓漢式單例模式 public class singleton private static singleton single null public static singleton getinstance return single 在單執行緒中,這樣寫,不會存在任...

多執行緒 單例模式

單例模式 是非常典型常用的一種設計模式 乙份資源只能被申 載一次 單例模式的方法建立的類在當前程序中只有乙個例項 資源的程式初始化的時候就去載入,後面使用的時候直接使用,使用的時候比較流暢,有可能會載入用不上的資源,導致程式初始化時間比較慢。include class single instance...

單例模式多執行緒

單例模式 確保某個類只有乙個例項化物件 import time class a from threading import lock instance none lock lock def new cls,args,kwargs 加鎖確保時間片不發生輪轉 with cls.lock ifnot cl...