代码之家  ›  专栏  ›  技术社区  ›  Matt Davis

是否可以安全地从泛型集合获取计数值,而不锁定集合?

  •  9
  • Matt Davis  · 技术社区  · 15 年前

    我想知道的是,在不首先锁定集合的情况下访问Count属性是否可以。

    JaredPar引用Count属性 in his blog 作为可能导致比赛条件的决策程序,如下所示:

    if (list.Count > 0)
    {
        return list[0];
    }
    

    如果列表中有一个项目,并且该项目在访问Count属性之后但在索引器之前被删除,则会发生异常。我明白了。

    但是,使用Count属性来确定一个完全不同的集合的初始大小,可以吗?这个 MSDN documentation 说实例成员不能保证线程安全,所以我应该在访问Count属性之前锁定集合吗?

    1 回复  |  直到 15 年前
        1
  •  23
  •   Jon Skeet    15 年前

    犯罪嫌疑人 就“不会导致任何灾难性错误”而言,它是“安全的”——但您可能会得到过时的数据。那是因为我 犯罪嫌疑人

    就我个人而言,我会保持简单:如果要访问共享的可变数据,只能在锁中访问(对相同的数据使用相同的锁)。如果你有适当的隔离(因此你知道你有适当的内存屏障,你知道你永远不会在一个线程中修改它,而你在另一个线程中读取它),那么无锁编程是非常好的,但听起来这里不是这样的。