import threading import time class Singleton(object): _instance_lock = threading.Lock() def __init__(self): time.sleep(1) @classmethod def instance(cls, *args, **kwargs): if not hasattr(Singleton, "_instance"): with Singleton._instance_lock: if not hasattr(Singleton, "_instance"): print ("Init Singleton") Singleton._instance = Singleton(*args, **kwargs) return Singleton._instance class MySingleton(Singleton): def __init__(self): import time time.sleep(1) print ("MySingleton") def task(arg): obj = Singleton.instance() print(obj) for i in range(20): t = threading.Thread(target=task, args=[i,]) t.start() time.sleep(20) obj = Singleton.instance() print(obj)