雙重檢查 線程安全的python單例模式

 要點:

  • 線程鎖進行同步,雙重檢查避免重複創建;
  • 不允許直接實例化該類
import threading
from time import sleep



class SingletonSample(object):
    _instanceLock = threading.Lock()

    def __init__(self):
        sleep(1)

    def __new__(cls, *args, **kwargs):
        msg = "Cann't new a SingletonSample class, please use get_instance method!"
        raise NotImplementedError(msg)

    @classmethod
    def get_instance(cls):
        if not hasattr(cls, "_instance"):
            print("get here 1")
            with cls._instanceLock:
                if not hasattr(cls, "_instance"):
                    print("get here 2")
                    cls._instance = super(SingletonSample, cls).__new__(cls)
                    print cls._instance
        return cls._instance


def task():
    so = SingletonSample.get_instance()
    print so

if __name__ == "__main__":

    try:
        error_so = SingletonSample()
    except Exception as e:
        print("ERROR, exception caught!Detail is: %s" % e)

    for i in range(20):
        thread = threading.Thread(target=task, name="thread-%d" % i)
        thread.start()

運行一下:

C:\Python27\python.exe D:/代碼/python-DP/SingletonSample.py
ERROR, exception caught!Detail is: Cann't new a SingletonSample class, please use get_instance method!
get here 1
get here 2
<__main__.SingletonSample object at 0x03329A50>
<__main__.SingletonSample object at 0x03329A50>
<__main__.SingletonSample object at 0x03329A50>
<__main__.SingletonSample object at 0x03329A50>
<__main__.SingletonSample object at 0x03329A50>
<__main__.SingletonSample object at 0x03329A50>
<__main__.SingletonSample object at 0x03329A50>
<__main__.SingletonSample object at 0x03329A50>
<__main__.SingletonSample object at 0x03329A50>
<__main__.SingletonSample object at 0x03329A50>
<__main__.SingletonSample object at 0x03329A50>
<__main__.SingletonSample object at 0x03329A50>
<__main__.SingletonSample object at 0x03329A50>
<__main__.SingletonSample object at 0x03329A50>
<__main__.SingletonSample object at 0x03329A50>
<__main__.SingletonSample object at 0x03329A50>
<__main__.SingletonSample object at 0x03329A50>
<__main__.SingletonSample object at 0x03329A50>
<__main__.SingletonSample object at 0x03329A50>
<__main__.SingletonSample object at 0x03329A50>
<__main__.SingletonSample object at 0x03329A50>

Process finished with exit code 0

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章