【Go】资源竟态检测工具:race detetor

简介:

试了一下,简直牛逼。鉴于处于快速入门阶段,就不去挖底层原理了,等面铺开了再深入。

用一个有点并发经验的人都能看出来的例子,累加:

package main

import (
    "fmt"
    "sync"
)

func main() {
    var count = 0
    // 使用WaitGroup等待10个goroutine完成
    var wg sync.WaitGroup
    wg.Add(10)
    for i := 0; i < 10; i++ {
        go func() {
            defer wg.Done()
            // 对变量count执行10次加1
            for j := 0; j < 10000; j++ {
                count++
            }
        }()
    }
    // 等待10个goroutine完成
    wg.Wait()
    fmt.Println(count)
}

不上锁时是这样的:

PS C:\Users\Administrator\Desktop\go> go build main.go
PS C:\Users\Administrator\Desktop\go> .\main.exe      
49376

接下来让我们看看 race detetor 的表现:

PS C:\Users\Administrator\Desktop\go> go build -race main.go
PS C:\Users\Administrator\Desktop\go> .\main.exe
==================
WARNING: DATA RACE
Read at 0x00c0000ac078 by goroutine 8:
  main.main.func1()
      C:/Users/Administrator/Desktop/go/main.go:18 +0xa8

Previous write at 0x00c0000ac078 by goroutine 7:
  main.main.func1()
      C:/Users/Administrator/Desktop/go/main.go:18 +0xba

Goroutine 8 (running) created at:
  main.main()
      C:/Users/Administrator/Desktop/go/main.go:14 +0x8d

Goroutine 7 (finished) created at:
  main.main()
      C:/Users/Administrator/Desktop/go/main.go:14 +0x8d
==================
48462
Found 1 data race(s)

懂得都懂,真正项目里的资源竟态隐藏的都很深,一爆出来那死伤是难以估量的。

相关文章
|
3月前
|
监控 Java 编译器
限流、控并发、减GC!一文搞懂Go项目资源优化的正确姿势
本章介绍Go语言项目在构建与部署阶段的性能调优和资源控制策略,涵盖编译优化、程序性能提升、并发与系统资源管理、容器化部署及自动化测试等内容,助力开发者打造高效稳定的生产级应用。
|
5月前
|
人工智能 缓存 安全
Go开发遇见的一次Data Race
本文通过一段 Go 语言代码示例,分析了并发编程中的数据竞争(Data Race)问题。代码实现了一个带缓存的内存存储系统,包含 `LRUCache` 和 `MemoryCache` 两个核心组件。尽管在 `MemoryCache` 的 `Set` 方法中加了锁保护,但由于直接调用 `LRUCache` 的 `GetLength` 方法时未加锁,导致底层数据结构在多 goroutine 环境下被同时读写,从而触发 Data Race。文章详细解析了问题根源,并提出了解决方案:为 `LRUCache` 的 `Add` 方法添加锁保护,确保并发安全。
|
Kubernetes 监控 Cloud Native
"解锁K8s新姿势!Cobra+Client-go强强联手,打造你的专属K8s监控神器,让资源优化与性能监控尽在掌握!"
【8月更文挑战第14天】在云原生领域,Kubernetes以出色的扩展性和定制化能力引领潮流。面对独特需求,自定义插件成为必要。本文通过Cobra与Client-go两大利器,打造一款监测特定标签Pods资源使用的K8s插件。Cobra简化CLI开发,Client-go则负责与K8s API交互。从初始化项目到实现查询逻辑,一步步引导你构建个性化工具,开启K8s集群智能化管理之旅。
201 2
|
Linux Go 调度
Go 协程为什么比进程和线程占用的系统资源低?
Go 协程为什么比进程和线程占用的系统资源低?
154 0
|
存储 Go 开发工具
go语言后端开发学习(二)——基于七牛云实现的资源上传模块
go语言后端开发学习(二)——基于七牛云实现的资源上传模块
185 0
|
Go 知识图谱
GO学习路线及资源分享
GO学习路线及资源分享
122 1
|
Go 知识图谱 Cloud Native
GO语言学习路线及资源分享 | GO主题月
go语言网站 如下为用到的资源网站,整理如下
228 0
GO语言学习路线及资源分享 | GO主题月
|
存储 缓存 安全
Go Mutex:保护并发访问共享资源的利器
本文主要介绍了 Go 语言中互斥锁 Mutex 的概念、对应的字段和方法、基本使用和易错场景,最后基于 Mutex 实现一个简单的线程安全的缓存。
336 0
Go Mutex:保护并发访问共享资源的利器
|
缓存 测试技术 Go
使用 go race 排查 protobuf Marshal Panic
使用 go race 排查 protobuf Marshal Panic
273 0
|
JSON 运维 Shell
使用go做一个https证书时间检测工具
使用go做一个https证书时间检测工具
351 0

热门文章

最新文章