经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » Go语言 » 查看文章
[Go] 解决go的fatal error: concurrent map writes map非并发安全
来源:cnblogs  作者:陶士涵  时间:2021/5/6 18:01:11  对本文有异议

map不是并发安全的 , 当有多个并发的groutine读写同一个map时 

会出现panic错误

concurrent map writes

 

例如下面的代码会出现这个错误:

  1. var mMap map[int]int
  2. func TestMyMap(t *testing.T) {
  3. mMap = make(map[int]int)
  4. for i := 0; i < 5000; i++ {
  5. go func() {
  6. mMap[i] = i
  7. }()
  8. go readMap(i)
  9. }
  10. }
  11. func readMap(i int) int {
  12. return mMap[i]
  13. }

解决这个错误可以有多种方式 , 现在采取读写锁的方式 ,

并发访问map是不安全的,会出现未定义行为,导致程序退出。所以如果希望在多协程中并发访问map,必须提供某种同步机制,一般情况下通过读写锁sync.RWMutex实现对map的并发访问控制,将map和sync.RWMutex封装一下,可以实现对map的安全并发访问

改造后的代码

  1. type SMap struct {
  2. sync.RWMutex
  3. Map map[int]int
  4. }
  5. func (l *SMap) readMap(key int) (int, bool) {
  6. l.RLock()
  7. value, ok := l.Map[key]
  8. l.RUnlock()
  9. return value, ok
  10. }
  11. func (l *SMap) writeMap(key int, value int) {
  12. l.Lock()
  13. l.Map[key] = value
  14. l.Unlock()
  15. }
  16. var mMap *SMap
  17. func TestMyMap(t *testing.T) {
  18. mMap = &SMap{
  19. Map: make(map[int]int),
  20. }
  21. for i := 0; i < 5000; i++ {
  22. go func() {
  23. mMap.writeMap(i, i)
  24. }()
  25. go readMap(i)
  26. }
  27. }
  28. func readMap(i int) (int, bool) {
  29. return mMap.readMap(i)
  30. }

 有这三种方式:

1.使用channel
2.使用sync.map
3.使用map但必须进行加锁

原文链接:http://www.cnblogs.com/taoshihan/p/14717701.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号