zoukankan      html  css  js  c++  java
  • 单例双重检查引发的资源竞争/数据竞争

    最近在写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 的操作的确存在资源争夺的问题,但是似乎这种双重检查的写法在单例模式中十分常见,属于常规操作。如果不加双重检查,每次读取都需要加锁,肯定要影响性能。这种看似无害的资源竞争是否可以存在呢?

  • 相关阅读:
    HDU6216
    HDU6213
    HDU6191(01字典树启发式合并)
    HDU4825(01字典树)
    HDU5293(SummerTrainingDay13-B Tree DP + 树状数组 + dfs序)
    HDU2196(SummerTrainingDay13-D tree dp)
    HDU6201
    HDU6205
    HDU6195
    ffmpeg.编译20200719
  • 原文地址:https://www.cnblogs.com/TO-WW/p/14438295.html
Copyright © 2011-2022 走看看