網站首頁 編程語言 正文
一、單例模式
單例模式,實現一個類,并且保證這個類的多次實例化操作,都會只生成同一個實例對象。
二、應用場景
整個系統中只需要存在一個實例對象,其他對象都可以通過訪問該對象來獲取信息,比如:
- 系統的配置信息對象
- 日志對象
- 數據庫操作對象
- 線程池對象
三、編碼示例
1.單線程中的單例模式
方式一、重載類構造器
定義:
class Singleton(object): ? ? _instance = None ? ? def __new__(cls, *args, **kwargs): ? ? ? ? if cls._instance is None: ? ? ? ? ? ? cls._instance = object.__new__(cls, *args, **kwargs) ? ? ? ? return cls._instance
使用:
if __name__ == '__main__': ? ? instance1 = Singleton() ? ? instance2 = Singleton() ? ? instance3 = Singleton() ? ? # 打印出 3 個實例對象的內存地址,判斷是否相同。 ? ? print(id(instance1)) ? ? print(id(instance2)) ? ? print(id(instance3))
方式二、實現單例裝飾器
定義:
def singleton(cls): ? ? _instance = {} ? ? def _singleton(*args, **kargs): ? ? ? ? if cls not in _instance: ? ? ? ? ? ? _instance[cls] = cls(*args, **kargs) ? ? ? ? return _instance[cls] ? ? return _singleton
使用:
@singleton class Singleton(object): ? ? """單例實例""" ? ? def __init__(self, arg1): ? ? ? ? self.arg1 = arg1 if __name__ == '__main__': ? ? instance1 = Singleton("xag") ? ? instance2 = Singleton("xingag") ? ? print(id(instance1)) ? ? print(id(instance2))
2.多線程中的單例模式
方式三、重載具有線程鎖的類構造器
多線程中的單例模式,需要在__new__
構造器中使用threading.Lock()
同步鎖。
定義:
class Singleton(object): ? ? _instance = None ? ? _instance_lock = threading.Lock() ? ? def __new__(cls, *args, **kwargs): ? ? ? ? if cls._instance is None: ? ? ? ? ? ? with cls._instance_lock: ? ? ? ? ? ? ? ? cls._instance = object.__new__(cls, *args, **kwargs) ? ? ? ? return cls._instance
使用:
def task(arg): ? ? instance = Singleton() ? ? print(id(instance), '\n') if __name__ == '__main__': ? ? for i in range(3): ? ? ? ? t = threading.Thread(target=task, args=[i, ]) ? ? ? ? t.start()
原文鏈接:https://is-cloud.blog.csdn.net/article/details/122541891
相關推薦
- 2023-05-24 pytorch中retain_graph==True的作用說明_python
- 2022-08-05 C#實現圖形界面的時鐘_C#教程
- 2022-05-11 深入理解AQS之獨占鎖ReentrantLock源碼分析
- 2022-11-11 Vant 3.* 底部安全區適配 部分頁面不生效
- 2023-05-22 Redis數據結構類型示例解析_Redis
- 2022-02-14 el-form的label和表單自適應填滿一行且靠左對齊
- 2023-03-15 pandas創建DataFrame對象失敗的解決方法_python
- 2023-10-15 centos 切換g++
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支