Sobes.tech
Junior

Qual é a importância da sincronização de acesso aos dados no desenvolvimento de software?

sobes.tech IA

Resposta da IA

A sincronização de acesso aos dados previne condições de corrida em programas multithread ou paralelos. Isto é crucial para:

  • Integridade dos dados: Garante que os dados não serão corrompidos devido a leituras e escritas simultâneas por diferentes threads.
  • Previsibilidade do comportamento: Assegura a execução determinista do programa independentemente do agendador de threads.
  • Confiabilidade: Reduz o risco de erros difíceis de depurar que só aparecem sob certas condições de concorrência.

Em Go, utilizam-se primitivas do pacote sync para sincronização:

  • sync.Mutex: Bloqueio mútuo, apenas uma goroutine pode ter o bloqueio.
  • sync.RWMutex: Bloqueio para leitura/escrita. Permite que várias goroutines leiam simultaneamente, mas apenas uma escreva.
  • sync.WaitGroup: Aguarda a conclusão de um grupo de goroutines.
  • sync.Once: Garante que uma ação seja executada apenas uma vez.
  • sync.Cond: Variáveis condicionais para coordenação de goroutines.

Exemplo de uso de sync.Mutex:

package main

import (
	"fmt"
	"sync"
)

var counter int
var mu sync.Mutex

func increment() {
	mu.Lock() // Adquire o mutex
	counter++
	mu.Unlock() // Libera o mutex
}

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("Contador final:", counter) // Esperado: 1000
}

Abordagem alternativa em Go é usar canais para troca de dados entre goroutines (princípio "Não comunique compartilhando memória; compartilhe memória comunicando."). Isto frequentemente simplifica a sincronização e é idiomático em Go.