Skip to content

Cum Să Implementezi Singleton Pattern — Utilizare și Thread-Safety

DodaTech Updated 2025-01-15 2 min read

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

  1. Singleton fără thread-safety în aplicații concurente
  2. Singleton pentru clase care ar trebui să fie statice (utility classes)
  3. Dependințe ciclice între singleton-uri
  4. Singleton care păstrează stare mutable între request-uri în web apps
  5. Dificultate la testare — Singleton face mock-ingul dificil

Întrebări Frecvente

### Ce este Singleton pattern?

Singleton este un design pattern care asigură că o clasă are o singură instanță și oferă un punct global de acces la aceasta.

Când ar trebui să folosesc Singleton?

Pentru resurse care trebuie partajate global: conexiuni la baze de date, configurații, loggeri, pool-uri de thread-uri.

Este Singleton considerat un anti-pattern?

În unele contexte da, pentru că introduce stare globală și face codul greu de testat. Folosește-l cu moderație și consideră Dependency Injection ca alternativă.

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