Î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()
}