Python单例模式只懒汉饿汉以及线程安全的单例

饿汉式单例模式实现预先加载,急切初始化,单例对象在类实例化前创建。
 

[Python] 纯文本查看 复制代码
?
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
class Singleton(object):
    """  """
    _instance = None
 
    def __new__(cls, *args, **kwargs):
        if not hasattr(Singleton, '_instance'):
            cls._instance = super(Singleton, cls).__new__(cls)
        return cls._instance
 
    @classmethod
    def get_instance(cls):
        return cls._instance
 
    @classmethod
    def sum(cls, num1, num2):
        print(Singleton._instance)
        return num1 + num2
 
    @staticmethod
    def reduce(num1, num2):
        print(Singleton._instance)
        return num1 - num2



优点:
1. 线程安全
2. 在类实例化前已经创建好一个静态对象,调用时反应速度快
3. 直接执行其他方法或静态方法时,单例实例不会被初始化
缺点:
1. 不管使用与否,实例化前就初始化静态对象,有点资源浪费; 


懒汉式单例模式实现

[Python] 纯文本查看 复制代码
?
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
class Singleton(object):
    """
    # 懒汉模式: 只有在使用时才创建单例对象,实例化时不创建
    """
    _instance = None
 
    def __init__(self):
        if not hasattr(Singleton, '_instance'):
            print("__init__ method called, but no instance created")
        else:
            print("instance already created:", self._instance)
 
    @classmethod
    def get_instance(cls):
        if not cls._instance:
            cls._instance = Singleton()
        return cls._instance

 

优点:
1. 资源利用合理,不调用 get_instance 方法不创建单例对象
缺点:
1. 线程不安全,多线程时可能会获取到不同单例对象的情况。解决办法是加互斥锁,但会降低效率
线程安全的单例

 

[Python] 纯文本查看 复制代码
?
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
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
  
    def __init__(self, num):
        self.a = num + 5

你可能感兴趣的:(python)