读者 - 写者模型(Reader - Writer Model)§

读者 - 写者模型主要用于处理对共享资源(如文件、数据库记录或内存中的数据结构)的并发访问。在这个模型中,有两种角色:读者和写者。读者可以同时对共享资源进行读取操作,而写者在对共享资源进行写操作时,需要独占访问权,即不允许其他读者或写者同时访问。

package main

import (
    "sync"
    "time"
)

// 共享资源,这里简单模拟为一个整数变量
var sharedData int

// 读写锁,用于控制对共享资源的并发访问
var rwMutex sync.RWMutex

// Reader结构体代表读者
type Reader struct {
    id int
}

// Writer结构体代表写者
type Writer struct {
    id int
}

// Read方法模拟读者读取共享资源的操作
func (r *Reader) Read() {
    rwMutex.RLock()
    defer rwMutex.RUnlock()
    // 这里简单打印读取到的数据,实际可以进行更复杂的处理
    println("Reader", r.id, "reads data:", sharedData)
}

// Write方法模拟写者写入共享资源的操作
func (w *Writer) Write() {
    rwMutex.Lock()
    defer rwMutex.Unlock()
    sharedData++
    println("Writer", w.id, "writes data:", sharedData)
}

func main() {
    var readers []*Reader
    var writers []*Writer

    // 创建5个读者和3个写者
    for i := 1; i <= 5; i++ {
        readers = append(readers, &Reader{id: i})
    }
    for i := 1; i <= 3; i++ {
        writers = append(writers, &Writer{id: i})
    }

    // 模拟并发访问,这里简单通过循环多次来体现
    for j := 0; j < 10; j++ {
        for _, reader := range readers {
            go reader.Read()
        }
        for _, writer := range writers {
            go writer.Write()
        }
        time.Sleep(100 * time.Millisecond)
    }
}