使用python寫一個線程安全的單例

單例在各類編程語言開發中都很常見,前面咱們使用Java OC swift 分別對單例進行了探討,下面咱們使用python寫一個線程安全的單例。python

import threading


def synchronized(func):
    func.__lock__ = threading.Lock()

    def lock_func(*args, **kwargs):
        with func.__lock__:
            return func(*args, **kwargs)

    return lock_func


class Singleton(object):
    instance = None

    @synchronized
    def __new__(cls, *args, **kwargs):
        """ :type kwargs: object """
        if cls.instance is None:
            cls.instance = super().__new__(cls)
        return cls.instance


if __name__ == "__main__":
    a = Singleton(3)
    print("a單例! id爲 %s" % id(a))
    b = Singleton(4)
    print("b單例! id爲 %s" % id(b))
    str = "hello world !"
    c = Singleton(str)
    print("c單例! id爲 %s" % id(c))
    
    print("ok!")
複製代碼

在python3中,調用父類的方法是用super()來調用。 咱們這裏經過鎖來進行保護,保證多線程的狀況下同一時刻只有一個線程訪問,這就保證了單例模式的安全 將類傳入單例修飾器中,若是該類還未生成實例(instances中不存在該類),那麼就生成一個新的實例返回,並記錄在instances中。若是已經instances中已經存在該類,那麼直接返回實例cls.instance編程

id是內置方法,咱們經過id來判斷對象是不是單例。運行結果以下swift

python線程安全的單例
相關文章
相關標籤/搜索