Golang并发数据结构-Golang

首页 2024-07-03 21:38:48

go 这种语言提供了两种并发数据结构:互斥体和读写锁:互斥体(sync.mutex):允许一次只有一个线程执行临界区域,以确保串行访问共享数据。读写锁(sync.rwmutex):允许多线程并发读取共享数据,但一次只能在共享数据中写一个线程,以提高读写效率。

Go 并发数据结构在语言中的实现

并发数据结构在多线程应用程序中非常重要,它们可以确保多线程能够安全高效地访问共享数据。Go 语言提供了丰富的并发数据结构,本文将介绍如何实现两种常用的并发数据结构:互斥体读写锁

互斥体

互斥体是一种同步原语,允许一次只执行一个临界区域的线程。在 Go 可用于语言 sync.Mutex 实现互斥体的类型。

import (
    "fmt"
    "sync"
)

func main() {
    var mu sync.Mutex
    cnt := 0

    // 创建一个 goroutine 增加计数器
    go func() {
        mu.Lock()
        defer mu.Unlock()
        cnt  
        fmt.Println("goroutine increased the counter to", cnt)
    }()

    // 主 goroutine 等待 goroutine 完成
    mu.Lock()
    fmt.Println("main goroutine <a style='color:#f60; text-decoration:underline;' href="https://www.php.cn/zt/16380.html" target="_blank">access</a>ed the counter", cnt)
    mu.Unlock()
}

这个例子中,mu.Lock() 会阻塞主 goroutine 直到它获得互斥锁,然后 goroutine 可执行临界区(增加计数器)。一旦 goroutine 完成后,它将释放锁,允许主 goroutine 访问计数器。

立即学习“go语言免费学习笔记(深入);

读写锁

读写锁是一种更先进的同步原语,允许多线程并读取共享数据,但一次只能在共享数据中写一个线程。在 Go 可用于语言 sync.RWMutex 实现读写锁的类型。

import (
    "fmt"
    "sync"
)

func main() {
    var rwlock sync.RWMutex
    cnt := 0

    // 创建两个 goroutine 读取计数器
    for i := 0; i < 2; i   {
        go func(i int) {
            rwlock.RLock()
            defer rwlock.RUnlock()
            fmt.Println("goroutine", i, "read the counter", cnt)
        }(i)
    }

    // 主 goroutine 等待读取器完成
    for i := 0; i < 2; i   {
        rwlock.Lock()
        defer rwlock.Unlock()
        cnt  = i
        fmt.Println("main goroutine increased the counter to", cnt)
    }
}

在这个例子中,多个 goroutine 读锁可以同时用来读取计数器,而主 goroutine 在写入计数器之前,它会被堵塞(持有写锁)。这可以确保多个读取器和一个写入器能够安全地访问共享数据。

以上就是golang并发数据结构实现的详细内容,更多请关注其它相关文章!


p
MySQL连接就这么简单!本地远程、编程语言连接方法一网打尽
还在为MySQL日期计算头疼?这份加一天操作指南能解决90%问题
MySQL日志到底在哪里?Linux/Windows/macOS全平台查找方法在此
MySQL数据库管理工具全景评测:从Workbench到DBeaver的技术选型指南
MySQL密码忘了怎么办?这份重置指南能救急,Windows/Linux/Mac都适用
你的MySQL为什么经常卡死?可能是锁表在作怪!快速排查方法在此
MySQL单表卡爆怎么办?从策略到实战,一文掌握「分表」救命技巧
清空MySQL数据表千万别用错!DELETE和TRUNCATE这个区别可能导致重大事故
你的MySQL中文排序一团糟?记住这几点,轻松实现准确拼音排序!
别再混淆Hive和MySQL了!读懂它们的天壤之别,才算摸到大数据的门道