当前位置: 首页 > 编程笔记 >

Go 并发访问地图

杜英叡
2023-03-14
本文向大家介绍Go 并发访问地图,包括了Go 并发访问地图的使用技巧和注意事项,需要的朋友参考一下

示例

进行中的映射并发并不安全。如果要同时访问它们,则必须加锁以对其进行读写。通常,最好的选择是使用,sync.RWMutex因为您可以拥有读写锁。但是,sync.Mutex也可以使用a。

type RWMap struct {
    sync.RWMutex
    m map[string]int
}

// Get是用于从基础映射中获取值的包装器
func (r RWMap) Get(key string) int {
    r.RLock()
    defer r.RUnlock()
    return r.m[key]
}

// Set是用于设置基础映射中键的值的包装器
func (r RWMap) Set(key string, val int) {
    r.Lock()
    defer r.Unlock()
    r.m[key] = val
}

// Inc增加键的RWMap中的值。
//   这比r.Set(key,r.Get(key)++)更令人愉快
func (r RWMap) Inc(key string) {
    r.Lock()
    defer r.Unlock()
    r.m[key]++
}

func main() {

    // 在里面
    counter := RWMap{m: make(map[string]int)}

    // 获取读锁
    counter.RLock()
    _ = counter.["Key"]
    counter.RUnlock()

    // 以上可以替换为
    _ = counter.Get("Key")

    // 获取写锁
    counter.Lock()
    counter.m["some_key"]++
    counter.Unlock()

    // 以上将需要写成 
    counter.Inc("some_key")
}

包装函数的权衡是在基础图的公共访问与正确使用适当的锁之间。

 类似资料:
  • 问题内容: 我知道这不是线程安全的,但是我不确定其确切含义。 在和都使用的情况下,以下哪种情况会引起问题并需要同步? 两个线程同时读取相同的索引 假设您不在乎获取旧元素还是新元素,则替换尝试同时访问的元素。 问题答案: 两个线程同时读取相同的索引 如果 列表是由分支and 的线程构造的,并且列表在线程被分支之前已完全构建并加载,则可以从公共线程读取多个线程。 这样做的原因是,使用线程和派生该线程的

  • 问题内容: 我正在试用Go的新模块系统,无法访问本地软件包。以下项目位于我的gopath外的桌面上的文件夹中。 我的项目结构如下: 告诉我 问题答案: 我强烈建议您使用go工具链,它可以解决这些问题。带vscode-go插件的Visual Studio Code非常有用。 这里的问题是Go需要相对于您或import语句的相对路径。根据您所在的位置,导入路径也应包括该位置。在这种情况下,import

  • 问题内容: 在具有并发访问的程序中使用映射时,是否需要在函数中使用互斥体来 读取 值? 问题答案: 读者众多,没有作家可以: https://groups.google.com/d/msg/golang- nuts/HpLWnGTp-n8/hyUYmnWJqiQJ 一个作家,没有读者是可以的。(否则,地图不会太好。) 否则,如果至少有一个作家,而作家或读者至少还有一个,那么 所有 读者 和 作家都

  • Go 在语言级别支持协程(多数语言在语法层面并不直接支持协程),叫做 goroutine. 人们把 Go 语言称之为 21 世纪的C语言,第一是因为 Go 语言设计简单,第二是因为21世纪最重要的就是并行程序设计,而Go从语言层面就支持并发和并行 Go 并发小案例 package main import ( "fmt" "time" ) func sing() { fo

  • 问题内容: Go博客中的“ Go maps in action ”条目指出: 地图不能安全地并发使用:未定义同时读取和写入地图时会发生什么情况。如果您需要从并发执行的goroutine中读取和写入映射,则必须通过某种同步机制来调解访问。保护地图的一种常见方法是使用sync.RWMutex。 但是,一种常见的访问地图的方法是使用关键字遍历它们。出于并发访问的目的,不清楚在一个循环内执行是“读”还是该

  • 问题内容: 我知道许多操作系统都在文件系统上执行某种锁定,以防止视图不一致。Java和/或Android是否可以保证文件访问的线程安全性?在我自己编写并发代码之前,我想尽可能多地了解这一点。 如果我错过了回答的类似问题,请随时关闭此线程。谢谢。 问题答案: Android建立在Linux之上,因此继承了Linux的文件系统语义。除非您明确锁定文件,否则多个应用程序和线程可以打开该文件以进行读/写访