Handling Concurrent Access to Shared Resources in Golang

Adeyinka Boluwatife - Jun 30 - - Dev Community

Golang's concurrency model with goroutines is powerful but can lead to race conditions when accessing shared resources. Here's a brief guide on handling these issues effectively.

Problem
Race conditions occur when multiple goroutines access shared resources concurrently, causing unpredictable behavior.

Solutions

  • Mutexes:Mutexes ensure only one goroutine can access a shared resource at a time.

Example:

package main

import (
    "fmt"
    "sync"
)

var (
    counter int
    mutex   sync.Mutex
)

func increment(wg *sync.WaitGroup) {
    defer wg.Done()
    for i := 0; i < 1000; i++ {
        mutex.Lock()
        counter++
        mutex.Unlock()
    }
}

func main() {
    var wg sync.WaitGroup

    for i := 0; i < 10; i++ {
        wg.Add(1)
        go increment(&wg)
    }

    wg.Wait()
    fmt.Println("Final counter value:", counter)
}
Enter fullscreen mode Exit fullscreen mode
  • Channels: Channels can synchronize goroutines by controlling access to shared resources.

Example:

package main

import (
    "fmt"
    "sync"
)

func increment(counter chan int, wg *sync.WaitGroup) {
    defer wg.Done()
    for i := 0; i < 1000; i++ {
        c := <-counter
        c++
        counter <- c
    }
}

func main() {
    var wg sync.WaitGroup
    counter := make(chan int, 1)
    counter <- 0

    for i := 0; i < 10; i++ {
        wg.Add(1)
        go increment(counter, &wg)
    }

    wg.Wait()
    fmt.Println("Final counter value:", <-counter)
}
Enter fullscreen mode Exit fullscreen mode
  • Atomic Operations: The sync/atomic package provides atomic memory primitives for safe concurrent access.

Example:

package main

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

var counter int64

func increment(wg *sync.WaitGroup) {
    defer wg.Done()
    for i := 0; i < 1000; i++ {
        atomic.AddInt64(&counter, 1)
    }
}

func main() {
    var wg sync.WaitGroup

    for i := 0; i < 10; i++ {
        wg.Add(1)
        go increment(&wg)
    }

    wg.Wait()
    fmt.Println("Final counter value:", counter)
}
Enter fullscreen mode Exit fullscreen mode

Conclusion
Prevent race conditions in Golang by using mutexes, channels, or atomic operations to synchronize access to shared resources. Choose the method that best fits your use case.Hng helped me groom my skills as a problem solver and i would want whoever reading this to look into the innternship and let them groom your skills as a developer HNG Internship and premium subscription.click the link to learn more.

.