Sobes.tech
Junior

Care este importanța sincronizării accesului la date în dezvoltarea software-ului?

sobes.tech AI

Răspuns de la AI

Sincronizarea accesului la date previne condițiile de cursă (race condition) în programe multi-thread sau paralele. Acest lucru este critic pentru:

  • Integritatea datelor: Asigură că datele nu vor fi corupte din cauza citirii și scrierii simultane de către fire diferite.
  • Previzibilitatea comportamentului: Asigură executarea deterministă a programului, indiferent de planificatorul de fire.
  • Fiabilitatea: Reduce riscul apariției unor erori dificil de depanat, care apar doar în anumite condiții de concurență.

În Go, se folosesc primitive din pachetul sync pentru sincronizare:

  • sync.Mutex: Blocare mutuală, doar o gorutină poate deține blocarea.
  • sync.RWMutex: Blocare pentru citire/scriere. Permite mai multor gorutine să citească simultan, dar doar uneia să scrie.
  • sync.WaitGroup: Așteaptă finalizarea unui grup de gorutine.
  • sync.Once: Asigură că o acțiune se execută o singură dată.
  • sync.Cond: Variabile condiționale pentru coordonarea gorutinelor.

Exemplu de utilizare a sync.Mutex:

package main

import (
	"fmt"
	"sync"
)

var counter int
var mu sync.Mutex

func increment() {
	mu.Lock() // Obține mutex-ul
	counter++
	mu.Unlock() // Eliberează mutex-ul
}

func main() {
	var wg sync.WaitGroup
	for i := 0; i < 1000; i++ {
		wg.Add(1)
		go func() {
			defer wg.Done()
			increment()
		}()
	}
	wg.Wait()
	fmt.Println("Contor final:", counter) // Se așteaptă: 1000
}

O abordare alternativă în Go este utilizarea canalelor pentru schimbul de date între gorutine (principiul "Nu comunica prin partajarea memoriei; partajează memoria comunicând."). Acest lucru simplifică adesea sincronizarea și este idiomatic în Go.