Actualizări de Date Fără Blocare cu atomic.Pointer și atomic.Value în Go în Go

Ghid de concurență lock-free în Go cu atomic.Pointer (generics) și atomic.Value: reîncărcarea fără blocare a configurațiilor globale, tabelelor de rutare și cache-urilor partajate între mii de goroutine-uri.

Sintaxă
var cfg atomic.Pointer[Config]; cfg.Store(&newCfg); c := cfg.Load();

În serverele web cu încărcare mare, citirea frecventă a unei configurații globale folosind un sync.RWMutex poate deveni un punct de blocaj din cauza contencțiunii pe lock-ul de citire (Read-Lock contention). Pachetul sync/atomic oferă tipul generic atomic.Pointer[T] (introdus în Go 1.19) și tipul clasic atomic.Value, care permit citirea și actualizarea atomică a unui pointer de structură printr-o singură instrucțiune hardware fără nicio blocare (Lock-Free Read).

Reîncărcarea la cald a configurației fără mutex cu atomic.Pointer
package main

import (
    "fmt"
    "sync/atomic"
    "time"
)

type ConfigServer struct {
    TitluSite    string
    TimeoutSecunde int
}

// Variabilă atomică globală tipizată generic:
var configuratieCurenta atomic.Pointer[ConfigServer]

func citesteConfiguratie() {
    // Citire lock-free ultra-rapidă (sub 1 nanosecundă):
    cfg := configuratieCurenta.Load()
    fmt.Printf("Configuratie activa: %s (Timeout: %ds)
", cfg.TitluSite, cfg.TimeoutSecunde)
}

func actualizeazaConfiguratieLaCald(nouaConfig ConfigServer) {
    // Scriere atomică sigură:
    configuratieCurenta.Store(&nouaConfig)
    fmt.Println("--> Configuratia a fost actualizata instantaneu!")
}

func main() {
    // Inițializare:
    configuratieCurenta.Store(&ConfigServer{TitluSite: "DexBlog v1", TimeoutSecunde: 30})
    citesteConfiguratie()

    // Actualizare la cald fără oprirea cititorilor:
    actualizeazaConfiguratieLaCald(ConfigServer{TitluSite: "DexBlog v2 Producție", TimeoutSecunde: 60})
    citesteConfiguratie()
}