码迷,mamicode.com
首页 > 其他好文 > 详细

单例双重检查引发的资源竞争/数据竞争

时间:2021-02-24 13:15:32      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:rgb   type   模式   string   竞争   写法   mem   var   emc   

最近在写golang代码,使用go编译器的race分析工具,提升以下代码有资源竞争的问题:

 1 type MemCache struct {
 2     data []string
 3 }
 4 
 5 var memCacheInstance *MemCache
 6 var memCacheCreateMutex sync.Mutex
 7 
 8 func GetMemCache() *MemCache {
 9     if memCacheInstance == nil {
10         memCacheCreateMutex.Lock()
11         defer memCacheCreateMutex.Unlock()
12 
13         if memCacheInstance == nil {
14             memCacheInstance = &MemCache{
15                 data: make([]string, 0),
16             }
17         }
18     }
19     return memCacheInstance
20 }

严格分析的话,加锁之前读取 memCacheInstance 的操作的确存在资源争夺的问题,但是似乎这种双重检查的写法在单例模式中十分常见,属于常规操作。如果不加双重检查,每次读取都需要加锁,肯定要影响性能。这种看似无害的资源竞争是否可以存在呢?

单例双重检查引发的资源竞争/数据竞争

标签:rgb   type   模式   string   竞争   写法   mem   var   emc   

原文地址:https://www.cnblogs.com/TO-WW/p/14438295.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!