Python线程安全单例模式:从基础到加锁实现

陆景行
陆景行
发布时间:2026-10-13| 3人浏览过
原创

本文深入解析Python中单例模式的实现原理,指出基础版本在多线程环境下的安全隐患。通过引入装饰器与线程锁机制,提供了完整的线程安全单例代码及测试用例,帮助开发者在构建服务器配置读取等场景时,避免内存浪费并确保实例唯一性。

单例模式是软件开发中广泛采用的一种设计范式,其核心目标在于严格控制类的实例化过程,确保在整个应用程序的生命周期内,特定类仅存在一个唯一的实例对象。

以服务器配置文件读取为例,假设配置信息存储于 online.conf 文件中,系统通过一个名为 Config 的类来封装读取逻辑。若程序运行期间多处需要访问配置内容,而每次调用都新建 Config 实例,将导致系统中涌现大量重复对象。特别是在配置数据量较大时,这种重复创建会无谓地消耗大量内存资源。实际上,对于 Config 类而言,整个运行期内只需维护一个实例即可满足需求,此时采用单例模式是最优解决方案。

在 Python 中,模块本身即具备天然单例特性。在此基础上,我们可以利用装饰器技术来手动实现单例模式,具体的代码实现如下所示:

def Singleton(cls):
 instances = {}

 def get_instance(*args, **kw):
  if cls not in instances:
   instances[cls] = cls(*args, **kw)
  return instances[cls]

 return get_instance

该实现逻辑直观简洁:将目标类传递给单例装饰器后,装饰器内部会检查 instances 字典中是否已存在该类的实例。若不存在,则创建新实例并将其存入 instances 中返回;若 instances 中已存在对应实例,则直接返回已缓存的实例对象 instances[cls]。

然而,上述代码并非完美无缺,它缺乏线程安全性。为了确保在多线程环境下的正确性,必须引入锁机制,确保同一时刻仅有一个线程能访问或创建单例实例。因此,我们需要进一步封装一个支持线程安全的装饰器,以下是包含完整逻辑及简单多线程测试用例的代码实现:

#!/usr/bin/python
# -*- coding: utf-8 -*-
import threading

def synchronized(func):
 func.__lock__ = threading.Lock()

 def synced_func(*args, **kws):
  with func.__lock__:
   return func(*args, **kws)

 return synced_func

def Singleton(cls):
 instances = {}

 @synchronized
 def get_instance(*args, **kw):
  if cls not in instances:
   instances[cls] = cls(*args, **kw)
  return instances[cls]

 return get_instance

def worker():
 single_test = test()
 print "id----> %s" % id(single_test)

@Singleton
class test():
 a = 1
if __name__ == "__main__":
 task_list = []
 for one in range(30):
  t = threading.Thread(target=worker)
  task_list.append(t)
 for one in task_list:
  one.start()
 for one in task_list:
  one.join()

以上内容涵盖了本文的核心知识点,旨在为读者提供实用的参考与帮助,同时也期待各位读者对本站内容给予更多支持与关注。

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。