python 實現執行緒安全的單例模式

2022-05-03 04:42:09 字數 1852 閱讀 7668

單例模式是一種常見的設計模式,該模式的主要目的是確保某乙個類只有乙個例項存在。當你希望在整個系統中,某個類只能出現乙個例項時,單例物件就能派上用場。

比如,伺服器的配置資訊寫在乙個檔案中online.conf中,客戶端通過乙個 config 的類來讀取配置檔案的內容。如果在程式執行期間,有很多地方都需要使用配置檔案的內容,那麼每個呼叫配置檔案的地方都會建立 config的例項,這就導致系統中存在多個config 的例項物件,在配置檔案內容很多的情況下,我們就浪費了大量的記憶體做了同樣的事。事實上,對於config類我們在程式執行期間時只需要乙個例項物件即可,這時單例模式就是最好的選擇。

python的模組就是天然的單例模式,這裡我們使用修飾器來實現單例模式,以下是**實現

def

singleton(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()

print

"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...