2024-简单点-python单例模式-__call__和__new__-线程安全版本

单例属性可变

先看一个版本,这版本虽然能控制成一个单实例,但是实例的值却可以变。。

import threading
class Singleton:  
    _instance = None  
    _lock = threading.Lock()  
  
    def __new__(cls, *args, **kwargs):  
        # 加锁以确保线程安全  
        with cls._lock:  
            if not cls._instance:  
                cls._instance = super().__new__(cls)  
        return cls._instance  
  
    def __init__(self, value):  
        self.value = value  

# 测试线程安全的单例模式  
def create_singleton(value):  
    return Singleton(value)  
  
# 创建两个看似独立的单例对象  
singleton1 = create_singleton(1)  
singleton2 = create_singleton(2)  
  
# 检查它们是否是同一个对象  
print(singleton1 is singleton2)  # 输出: True  
print(singleton1.value)  # 输出: 2

单例属性不可变

import threading  
  
class SingletonMeta(type):  
    _instances = {}  
    _lock = threading.Lock()  
  
    def __call__(cls, *args, **kwargs):  
        # 加锁以确保线程安全  
        with cls._lock:  
            if cls not in cls._instances:  
                cls._instances[cls] = super).__call__(*args, **kwargs)  
        return cls._instances[cls]  

class Singleton(metaclass=SingletonMeta):  
    def __init__(self, value):  
        self.value = value  
  
    def __str__(self):  
        return f"Singleton({self.value})"  

# 测试线程安全的单例模式  
def create_singleton(value):  
    return Singleton(value)  
  
# 创建两个看似独立的单例对象  
singleton1 = create_singleton(1)  
singleton2 = create_singleton(2)  
  
# 检查它们是否是同一个对象  
print(singleton1 is singleton2)  # 输出: True  
print(singleton1.value)  # 输出: 1

相关推荐

  1. 线安全模式

    2024-04-08 11:42:05       39 阅读
  2. 【多线线安全模式

    2024-04-08 11:42:05       26 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-08 11:42:05       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-08 11:42:05       100 阅读
  3. 在Django里面运行非项目文件

    2024-04-08 11:42:05       82 阅读
  4. Python语言-面向对象

    2024-04-08 11:42:05       91 阅读

热门阅读

  1. Linux Shell:用户配置文件详解

    2024-04-08 11:42:05       36 阅读
  2. MySQL:表的约束(上)

    2024-04-08 11:42:05       33 阅读
  3. 【软设】知识点速记2

    2024-04-08 11:42:05       35 阅读
  4. ffmpeg处理视频命令

    2024-04-08 11:42:05       28 阅读
  5. jenkins参数化构建

    2024-04-08 11:42:05       36 阅读
  6. MySQL的Seconds_Behind_Master 是如何计算的

    2024-04-08 11:42:05       25 阅读
  7. 【HTTP访问某个域名详细过程】

    2024-04-08 11:42:05       31 阅读
  8. 浅谈Mysql(四)——Mysql知识补充

    2024-04-08 11:42:05       41 阅读
  9. 用Python写一个简单的坦克大战游戏实例

    2024-04-08 11:42:05       40 阅读