單例模式是一種常見的設計模式,該模式的主要目的是確保某乙個類只有乙個例項存在。當你希望在整個系統中,某個類只能出現乙個例項時,單例物件就能派上用場。
比如,伺服器的配置資訊寫在乙個檔案中online.conf中,客戶端通過乙個 config 的類來讀取配置檔案的內容。如果在程式執行期間,有很多地方都需要使用配置檔案的內容,那麼每個呼叫配置檔案的地方都會建立 config的例項,這就導致系統中存在多個config 的例項物件,在配置檔案內容很多的情況下,我們就浪費了大量的記憶體做了同樣的事。事實上,對於config類我們在程式執行期間時只需要乙個例項物件即可,這時單例模式就是最好的選擇。
python的模組就是天然的單例模式,這裡我們使用修飾器來實現單例模式,以下是**實現
defsingleton(cls):
instances ={}
def get_instance(*args, **kw):
if cls not
ininstances:
instances[cls] = cls(*args, **kw)
return
instances[cls]
return get_instance
**也很簡單,將類傳入單例修飾器中,如果該類還未生成例項(instances中不存在該類),那麼就生成乙個新的例項返回,並記錄在instances中。如果已經instances中已經存在該類,那麼直接返回例項instances[cls]。
那麼這段**是完美的嗎?答案是否定的,這段**不是執行緒安全的。要實現執行緒安全需要配合鎖的使用,只有占有鎖的執行緒才能繼續訪問單例例項,看來我們需要再寫乙個修飾器來實現執行緒安全了,以下是完整的**實現和簡單的多執行緒測試用例。
#!/usr/bin/python
#-*- coding: utf-8 -*-
import
threading
defsynchronized(func):
func.
__lock__ =threading.lock()
def synced_func(*args, **kws):
with func.
__lock__
:
return func(*args, **kws)
return
synced_func
defsingleton(cls):
instances ={}
@synchronized
def get_instance(*args, **kw):
if cls not
ininstances:
instances[cls] = cls(*args, **kw)
return
instances[cls]
return
get_instance
defworker():
single_test =test()
"id----> %s
" %id(single_test)
@singleton
class
test():
a = 1
if__name__ == "
__main__":
task_list =
for one in range(30):
t = threading.thread(target=worker)
for one in
task_list:
one.start()
for one in
task_list:
one.join()
C 實現執行緒安全單例類
單例模式是一種非常常用的設計模式,幾乎在稍大的工程專案中都會用到。單例類保證在全域性中只有唯一乙個類的例項物件,並且在類的內部提供了獲取這個唯一例項的介面。在類中,例項化出乙個物件需要呼叫建構函式,為了防止在類的外部呼叫建構函式構造出例項,對類的建構函式就應有所限制,可以將建構函式的訪問許可權設定為...
C 實現執行緒安全的單例模式
廢話不多說,常用的 積澱下來。一 懶漢模式 即第一次呼叫該類例項的時候才產生乙個新的該類例項,並在以後僅返回此例項。需要用鎖,來保證其執行緒安全性 原因 多個執行緒可能進入判斷是否已經存在例項的if語句,從而non thread safety.使用double check來保證thread safe...
多執行緒單例模式的安全實現
多執行緒單例模式的實現。通過雙重鎖定,自旋處理,實現安全的多執行緒單例和共享區資料的訪問。資源訪問的形式採用簡單等待處理.同時使用std bind進行函式繫結。atomic lock flag p202 6 3 3.cpp 定義控制台應用程式的入口點。include stdafx.h include...