方案一
from functools import wraps
from threading import Lock
def singleton(cls):
"""线程安全单例"""
instance = {}
lock = Lock()
@wraps(cls)
def wrapper(*args, **kwargs):
if cls not in instance:
with lock:
if cls not in instance:
instance[cls] = cls(*args, **kwargs)
return instance[cls]
return wrapper
方案二
class Singleton:
lock = threading.Lock()
def __new__(cls, *args, **kwargs):
if not hasattr(cls, "_instance"):
with cls.lock:
if not hasattr(cls, "_instance"):
cls._instance = super().__new__(cls, *args, **kwargs)
return cls._instance
方案三
class SingletonMeta(type):
def __init__(cls, *args, **kwargs):
cls.__instance = None
cls.__lock = RLock()
def __call__(cls, *args, **kwargs):
if not cls.__instance:
with cls.__lock:
if not cls.__instance:
cls.__instance = super().__call__(*args, **kwargs)
return cls.__instance