Cum Să Implementezi Singleton Pattern — Utilizare și Thread-Safety
In this tutorial, you'll learn about Cum Să Implementezi Singleton Pattern. We cover key concepts, practical examples, and best practices.
Vei învăța cum să implementezi Singleton pattern corect, asigurând thread-safety și înțelegând când este soluția potrivită pentru aplicația ta.
Problema
Unele resurse (conexiuni la bază de date, loggeri, configurații) trebuie să existe într-o singură instanță în întreaga aplicație. Singleton pattern asigură acest lucru, dar implementarea incorectă duce la probleme de concurență.
Abordarea Greșită
Singleton fără thread-safety, care poate crea instanțe multiple în medii concurente.
# Greșit: fără thread safety
class DatabaseConnection:
_instance = None
def __new__(cls):
if cls._instance is None:
cls._instance = super().__new__(cls)
return cls._instance
Abordarea Corectă
Singleton cu thread-safety folosind lock.
import threading
class DatabaseConnection:
_instance = None
_lock = threading.Lock()
def __new__(cls):
if cls._instance is None:
with cls._lock:
if cls._instance is None:
cls._instance = super().__new__(cls)
return cls._instance
# Test
db1 = DatabaseConnection()
db2 = DatabaseConnection()
print(f"Sunt aceeași instanță: {db1 is db2}")
Rezolvare Pas cu Pas
1. Identifică resursa unică
Stabilește ce resursă trebuie să aibă o singură instanță.
2. Implementează cu thread-safety
Folosește double-checked locking.
import threading
class Configuration:
_instance = None
_lock = threading.Lock()
def __new__(cls, *args, **kwargs):
if cls._instance is None:
with cls._lock:
if cls._instance is None:
cls._instance = super().__new__(cls)
return cls._instance
3. Testează în mediu multi-threaded
def test_singleton():
instances = []
threads = [threading.Thread(target=lambda: instances.append(Configuration()))
for _ in range(100)]
for t in threads: t.start()
for t in threads: t.join()
assert all(i is instances[0] for i in instances)
print("Singleton test trecut: toate instanțele sunt identice")
Sfaturi de Prevenție
- Folosește double-checked locking pentru performanță și siguranță
- Consideră enum sau module ca alternative mai sigure în unele limbaje
- Nu folosi Singleton pentru tot — aplică doar când ai nevoie reală
Greșeli Comune
- Singleton fără thread-safety în aplicații concurente
- Singleton pentru clase care ar trebui să fie statice (utility classes)
- Dependințe ciclice între singleton-uri
- Singleton care păstrează stare mutable între request-uri în web apps
- Dificultate la testare — Singleton face mock-ingul dificil
Întrebări Frecvente
Construit de dezvoltatorii Doda Browser, DodaZIP și Durga Antivirus Pro. Uneltele DodaTech folosesc Singleton pentru conexiuni sigure și eficiente.
Built by the developers of DodaTech
Doda Browser, DodaZIP & Durga Antivirus Pro