当前位置: 首页 > 面试题库 >

在sync.Map中,必须对复杂值使用Load和LoadOrStore

韦原
2023-03-14
问题内容

在代码中,可以通过多个并发线程修改具有昂贵的生成价值结构的全局映射的哪个模式是正确的?

// equivalent to map[string]*activity where activity is a
// fairly heavyweight structure
var ipActivity sync.Map

// version 1: not safe with multiple threads, I think
func incrementIP(ip string) {
  val, ok := ipActivity.Load(ip)
  if !ok {
    val = buildComplexActivityObject()
    ipActivity.Store(ip, val)
  }

  updateTheActivityObject(val.(*activity), ip)
}

// version 2: inefficient, I think, because a complex object is built 
// every time even through it's only needed the first time
func incrementIP(ip string) {
  tmp := buildComplexActivityObject()
  val, _ := ipActivity.LoadOrStore(ip, tmp)
  updateTheActivity(val.(*activity), ip)
}

// version 3: more complex but technically correct?
func incrementIP(ip string) {
  val, found := ipActivity.Load(ip)
  if !found {
     tmp := buildComplexActivityObject()

     // using load or store incase the mapping was already made in 
     // another store
     val, _ = ipActivity.LoadOrStore(ip, tmp)
  }
  updateTheActivity(val.(*activity), ip)
}

给定Go的并发模型,第三版是否是正确的模式?


问题答案:

选项1显然可以被多个goroutine调用ip,并带有一个新的并发调用,并且只有if块中的最后一个会被存储。由于buildComplexActivityObject在关键部分有更多的时间,因此花费的时间越长,这种可能性就会大大增加。

选项2有效,但是buildComplexActivityObject每次都调用,而您声明的状态不是您想要的。

鉴于您希望buildComplexActivityObject不经常拨打电话,第三个选项是唯一有意义的选项。

sync.Map但是不能保护实际activity被存储的指针的参考价值。在更新activity值时,您还需要在那里进行同步。



 类似资料:
  • 对于命令和 如果我是对的: 如果我想从packagist向我的项目添加库,我需要使用 我有一个项目,我不想将其发布到https://packagist.org/ 我只想在我的项目中添加一些库。 在运行之前,是否必须运行? 我看了一个教程,其中他们使用命令,然后调用,这让我很困惑,因为我认为与在Packagist上发布库有关。

  • 问题内容: 结合使用带有ReactJS的ES5开发,可以将组件描述如下: 在此的示例引用对象本身,这是预期的自然行为。 题 我的问题是: 如何使用ES6创建组件? 知道在JavaScript中使用new运算符时会引用实例化对象本身,因此有人可以告诉我使用bind的真正目的是什么?这和React的内部机制有关吗? 问题答案: 只是核心javascript。这是绑定事件的工作方式。这不是一个React

  • 问题内容: 我有一个很长的JSON与Gson一起解析,但是为了简洁起见,我将其修剪为以下示例: 从SO和其他几个地方,我发现我需要定义一个顶级容器,例如下面的容器,但我不知道如何完成其​​定义 然后每堂课 我正在尝试解析它,这是到目前为止我编写的代码: JSON字符串存储在名为response的变量中 我的最终要求是of,并且关联。 问题答案: 第一个问题 :您的需求是: 它不必是静态的。 第二个

  • 问题内容: 我是Java编程的新手,需要通过网络解析一个复杂的JSON对象。过去一天,我一直在阅读有关GSON的文档,但能够完全解析这种类型的结构并没有太大的运气: 我已经能够使它与该问题类似地工作,但是无法弄清楚如何使该附加数组级别起作用。 问题答案: 使用GSON的正确格式是我正在寻找的格式:

  • 我正在尝试使用Retrofit2和静态编程语言发送一个复杂对象作为我请求的参数。该对象的结构如下: 列表字段的数量是不同的(可以是2个列表,也可以是10个)以及每个列表中的项目数量。我正在使用以下代码来实现这一点,之前用适当的值填充了我的Map: 由于某种原因,这种方法无法正常工作,服务器只是忽略了我的参数。我还尝试将它们作为string/ject发送,但服务器似乎只接受FormUrlEncode

  • 我不是高级R用户。我主要用它来进行矩阵代数计算。我有一个大矩阵(9400×9400;675.1MB),我想反转。我尝试了“解决”函数和“胆量2inv”,我得到了“错误在......‘a’一定是一个复杂的矩阵”。我也尝试了从MASS包的ginv函数,我得到了错误消息在svd(X)错误:无限或丢失值在'x'。我确信我的矩阵没有空(全零)列或行。我检查了使用:从数据框中删除具有零值的列,我得到了相同的矩