Go 如何创建线程安全的rand.Source?

Go 如何创建线程安全的rand.Source?,go,random,dependency-injection,Go,Random,Dependency Injection,标准库rand.NewSource函数的 与顶级函数使用的默认源不同,此源是 多个goroutine并发使用不安全 有没有办法创建线程安全的rand.Source 上下文:我有一个类型,它的方法可能被多个go例程调用,这个方法使用随机数。我想在测试中支持依赖项注入,所以我不能使用默认源。经过一些调查,我了解到,解决方法是使用互斥来保护源。标准库甚至是,lockedSource,但是是相关类型。通常使用a来确保一个或多个值不会同时访问。以下是如何使用sync.Mutex保护rand。来源: va

标准库
rand.NewSource
函数的

与顶级函数使用的默认源不同,此源是 多个goroutine并发使用不安全

有没有办法创建线程安全的
rand.Source


上下文:我有一个类型,它的方法可能被多个go例程调用,这个方法使用随机数。我想在测试中支持依赖项注入,所以我不能使用默认源。

经过一些调查,我了解到,解决方法是使用互斥来保护源。标准库甚至是,
lockedSource
,但是是相关类型。

通常使用a来确保一个或多个值不会同时访问。以下是如何使用sync.Mutex保护rand。来源:

 var s = rand.NewSource(seed)
 var mu sync.Mutex

// lock/unlock when accessing source from a goroutine
mu.Lock()
i := s.Int63()
mu.Unlock(
不支持并发使用。如果应用程序使用rand.Source创建rand.rand,请改为保护rand.rand:

 var r = rand.New(rand.NewSource(seed))
 var mu sync.Mutex

// lock/unlock when accessing the rand from a goroutine
mu.Lock()
i := r.Int()
mu.Unlock()
用于保护rand.rand的互斥锁也将保护rand.Source