Skip to content

Read-Write Lock

A read-write lock implementation supporting multiple readers or a single writer.

Installation

go
import "github.com/leoheung/go-patterns/parallel/rwlock"

API Reference

Create a Read-Write Lock

go
// Create a new read-write lock
rw := rwlock.NewRWLock()

Read Lock

go
// Acquire read lock
rw.RLock()
defer rw.RUnlock()

Write Lock

go
// Acquire write lock
rw.WLock()
defer rw.WUnlock()

Complete Example

go
package main

import (
    "fmt"
    "sync"
    "time"
    "github.com/leoheung/go-patterns/parallel/rwlock"
)

func main() {
    rw := rwlock.NewRWLock()
    data := make(map[string]string)
    var wg sync.WaitGroup

    // Writers
    for i := 0; i < 2; i++ {
        wg.Add(1)
        go func(id int) {
            defer wg.Done()

            rw.WLock()
            defer rw.WUnlock()

            key := fmt.Sprintf("key-%d", id)
            data[key] = fmt.Sprintf("value-%d", id)
            fmt.Printf("Writer %d wrote %s\n", id, key)
            time.Sleep(100 * time.Millisecond)
        }(i)
    }

    // Readers
    for i := 0; i < 5; i++ {
        wg.Add(1)
        go func(id int) {
            defer wg.Done()

            rw.RLock()
            defer rw.RUnlock()

            fmt.Printf("Reader %d reading, data count: %d\n", id, len(data))
            time.Sleep(50 * time.Millisecond)
        }(i)
    }

    wg.Wait()
}

Output

Writer 0 wrote key-0
Reader 0 reading, data count: 1
Reader 1 reading, data count: 1
Writer 1 wrote key-1
Reader 2 reading, data count: 2
...

Features

  • Multiple readers: Concurrent read access
  • Exclusive writer: Only one writer at a time
  • No reader starvation: Fair scheduling

Released under the MIT License.