volatile是否应与(非并发)集合一起使用?

时间:2011-06-29 13:49:27

标签: c# multithreading collections locking volatile

我熟悉volatile的基本思想(为了防止编译器优化涉及可以从多个线程访问的值的指令,总结),但我注意到我发现涉及的例子volatile和.NET 3.5集合(非.NET 4 Concurrent集合。我知道它们是什么,但我当前的上下文不允许我使用.NET 4.)从未应用volatile集合本身。当然,从多个线程访问集合时,需要锁定集合(或相应的锁定object),但有没有理由不将集合标记为volatile?集合类型是否重要(即List值类型与List引用类型相比)?

5 个答案:

答案 0 :(得分:7)

Volatile almost certainly doesn't mean what you think it does.这是不使用它的主要原因。 (这些天我拒绝尝试描述易失性的含义。它太复杂而不能整齐地解释,除非你是一个记忆模型专家,否则几乎总是错误的做法,在这种情况下你肯定不需要 me < / em>向你解释。)

如果你锁定了一个合适的物体,你认为它会带给你什么好处?在获取和释放锁时,你已经准备好通过适当的内存栅栏......我怀疑使用volatile变量本身的任何原因都是基于误解。

答案 1 :(得分:3)

如果您不更改引用(即创建一个全新的无关集合并在字段中替换它),则volatile将不执行任何操作。就个人而言,我可能会在线程密集的案例中创建集合字段readonly,以防止意外(并使用lock)。

所以可能:不。

答案 2 :(得分:3)

除非您实际更改集合的引用(即,重复将新集合分配给引用集合的变量),否则没有理由将该变量标记为volatile(也就是说,它不是做你认为它做的事情。)

即使你是(然后我会质疑你在做什么?),如果你volatile正确的话,你还不清楚是否需要lock

顺便说一句,这个主题真的很难。真的,真的,真的很难。

答案 3 :(得分:1)

你只需要使用锁。在你描述的内容中没有volatile的号召。

答案 4 :(得分:0)

如果您通过volatile标记集合,则只需标记引用本身,而不是整个集合。