【20240919 每日一题】请用代码写一个线程安全的单例模型?

难度

中等

题目

请用代码写一个线程安全的单例模型?

以下是使用Python实现线程安全的单例模式的例子,使用了threading.Lock来确保实例化过程的线程安全性。

import threading

class Singleton:
_instance_lock = threading.Lock()

def __init__(self):
    self.data = "Singleton Data"

def __new__(cls, *args, **kwargs):
    if not hasattr(cls, '_instance'):
        with cls._instance_lock:  # 确保线程安全
            if not hasattr(cls, '_instance'):
                cls._instance = super().__new__(cls)
    return cls._instance

def task(arg):
obj = Singleton()
print(f"Task {arg}: {obj.data}")

if name == “main”:
for i in range(10):
t = threading.Thread(target=task, args=(i,))
t.start()

解释

  1. Singleton 类:

    • _instance_lock: 用于锁定实例化过程,确保线程安全。
    • __init__: 初始化方法,设置一些数据成员。
    • __new__: 控制类的实例化过程。通过双重检查锁定机制(Double-checked locking)确保只有一个实例被创建。
  2. task 函数:

    • 创建 Singleton 实例,并打印其数据成员,验证所有线程共享同一个实例。
  3. 主程序:

    • 启动多个线程,每个线程调用 task 函数,验证单例模式的正确性。